January 25, 2018

Bir bakayım Ali hocam

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 25, 2018

Ali hocam numEntities zaten her kayıtta tekrarlanmıyor. ID tekrarlanıyor daha doğrusu hep aynı değeri alıyor ID.

numEntities benim yazdığım kodda bir kere okunuyor ardından readRaw onu tekrar okuyarak değişkene atamıyor.. sadece numEntities struct tanımının içinde yer alıyor o kadar.. Belki struct yapısının içinden çıkarsak sanki daha iyi bile olabilir çünkü structun tüm elemanlarını birşekilde foreach yada for ile döndürürken ona tekrar bir atama yapmaması lazım yada hatalardan dahamı kaçınmış olurduk acaba bilemedim..

doğru şekilde başkalarının yazdığı programlardaki değerlerle örtüşen program şimdilik bende şu şekilde;

import std.stdio;
import std.string;
import std.file;
import std.format;

struct  FALCON4_ct {
	short numEntities;
	ushort id;
	ushort collisionType;
	float collisionRadius;
	byte[8] classInfo;
	uint updateRate;
	uint updateTolerance;
	float fineUpdateRange;
	float fineUpdateForceRange;
	float fineUpdateMultiplier;
	uint damageSeed;
	int hitpoints;
	ushort majorRevisionNumber;
	ushort minorRevisionNumber;
	ushort createPriority;
	byte managementDomain;
	byte transferable;
	byte private_;
	byte tangible;
	byte collidable;
	byte global;
	byte persistent;
	ushort padding0_1;
	byte padding2;
	short[7] visType;
	short vehicleDataIndex;
	byte dataType;
	ushort dataPtr;
	short unknow1;
}

void dosyadanOku() {
	FALCON4_ct falcon4_ct;
	File dosya = File ("FALCON4.ct", "rb" );

	dosya.rawRead((&falcon4_ct.numEntities)[0..1]);
	writeln("Yapının boyutu= ",falcon4_ct.sizeof);

	for(int i=0;i<3; i++)  {   // kaç tane kayıt varsa okadar dönecek şimdilik 3..... for(int i=0;i<falcon4_ct.numEntities; i++)
		dosya.rawRead((&falcon4_ct.id)[0..1]);
		dosya.rawRead((&falcon4_ct.collisionType)[0..1]);
		dosya.rawRead((&falcon4_ct.collisionRadius)[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[0])[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[1])[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[2])[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[3])[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[4])[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[5])[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[6])[0..1]);
		dosya.rawRead((&falcon4_ct.classInfo[7])[0..1]);
		dosya.rawRead((&falcon4_ct.updateRate)[0..1]);
		dosya.rawRead((&falcon4_ct.updateTolerance)[0..1]);
		dosya.rawRead((&falcon4_ct.fineUpdateRange)[0..1]);
		dosya.rawRead((&falcon4_ct.fineUpdateForceRange)[0..1]);
		dosya.rawRead((&falcon4_ct.fineUpdateMultiplier)[0..1]);
		dosya.rawRead((&falcon4_ct.damageSeed)[0..1]);
		dosya.rawRead((&falcon4_ct.hitpoints)[0..1]);
		dosya.rawRead((&falcon4_ct.majorRevisionNumber)[0..1]);
		dosya.rawRead((&falcon4_ct.minorRevisionNumber)[0..1]);
		dosya.rawRead((&falcon4_ct.createPriority)[0..1]);
		dosya.rawRead((&falcon4_ct.managementDomain)[0..1]);
		dosya.rawRead((&falcon4_ct.transferable)[0..1]);
		dosya.rawRead((&falcon4_ct.private_)[0..1]);
		dosya.rawRead((&falcon4_ct.tangible)[0..1]);
		dosya.rawRead((&falcon4_ct.collidable)[0..1]);
		dosya.rawRead((&falcon4_ct.global)[0..1]);
		dosya.rawRead((&falcon4_ct.persistent)[0..1]);
		dosya.rawRead((&falcon4_ct.padding0_1)[0..1]);
		dosya.rawRead((&falcon4_ct.padding2)[0..1]);
		dosya.rawRead((&falcon4_ct.visType[0])[0..1]);
		dosya.rawRead((&falcon4_ct.visType[1])[0..1]);
		dosya.rawRead((&falcon4_ct.visType[2])[0..1]);
		dosya.rawRead((&falcon4_ct.visType[3])[0..1]);
		dosya.rawRead((&falcon4_ct.visType[4])[0..1]);
		dosya.rawRead((&falcon4_ct.visType[5])[0..1]);
		dosya.rawRead((&falcon4_ct.visType[6])[0..1]);
		dosya.rawRead((&falcon4_ct.vehicleDataIndex)[0..1]);
		dosya.rawRead((&falcon4_ct.dataType)[0..1]);
		dosya.rawRead((&falcon4_ct.dataPtr)[0..1]);
		dosya.rawRead((&falcon4_ct.unknow1)[0..1]);

		writeln("Num Entities= ",falcon4_ct.numEntities);
		writeln("Id= ",falcon4_ct.id);
		writeln("Collision Type= ",falcon4_ct.collisionType);
		writeln("collision Radius= ",falcon4_ct.collisionRadius);
		writeln("Class Info [0]= ",falcon4_ct.classInfo[0]);
		writeln("Class Info [1]= ",falcon4_ct.classInfo[1]);
		writeln("Class Info [2]= ",falcon4_ct.classInfo[2]);
		writeln("Class Info [3]= ",falcon4_ct.classInfo[3]);
		writeln("Class Info [4]= ",falcon4_ct.classInfo[4]);
		writeln("Class Info [5]= ",falcon4_ct.classInfo[5]);
		writeln("Class Info [6]= ",falcon4_ct.classInfo[6]);
		writeln("Class Info [7]= ",falcon4_ct.classInfo[7]);
		writeln("Update Rate= ",falcon4_ct.updateRate);
		writeln("Update Tolerance= ",falcon4_ct.updateTolerance);
		writeln("Fine Update Range= ",falcon4_ct.fineUpdateRange);
		writeln("FineUpdateForce Range= ",falcon4_ct.fineUpdateForceRange);
		writeln("Fine Update Multiplier= ",falcon4_ct.fineUpdateMultiplier);
		writeln("Damage Seed= ",falcon4_ct.damageSeed);
		writeln("Hitpoints= ",falcon4_ct.hitpoints);
		writeln("Major Revision Number= ",falcon4_ct.majorRevisionNumber);
		writeln("Minor Revision Number= ",falcon4_ct.minorRevisionNumber);
		writeln("Create Priority= ",falcon4_ct.createPriority);
		writeln("Management Domain= ",falcon4_ct.managementDomain);
		writeln("Transferable= ",falcon4_ct.transferable);
		writeln("Private= ",falcon4_ct.private_);
		writeln("Tangible= ",falcon4_ct.tangible);
		writeln("Collidable= ",falcon4_ct.collidable);
		writeln("Global= ",falcon4_ct.global);
		writeln("Persistent= ",falcon4_ct.persistent);
		writeln("Padding0_1= ",falcon4_ct.padding0_1);
		writeln("Padding2= ",falcon4_ct.padding2);
		writeln("Vis Type[0]= ",falcon4_ct.visType[0]);
		writeln("Vis Type[1]= ",falcon4_ct.visType[1]);
		writeln("Vis Type[2]= ",falcon4_ct.visType[2]);
		writeln("Vis Type[3]= ",falcon4_ct.visType[3]);
		writeln("Vis Type[4]= ",falcon4_ct.visType[4]);
		writeln("Vis Type[5]= ",falcon4_ct.visType[5]);
		writeln("Vis Type[6]= ",falcon4_ct.visType[6]);
		writeln("Vehicle Data Index= ",falcon4_ct.vehicleDataIndex);
		writeln("Data Type= ",falcon4_ct.dataType);
		writeln("Data Ptr _ RecordID= ",falcon4_ct.dataPtr);
		writeln("Unknow 1= ",falcon4_ct.unknow1);
		writeln();
		writeln();
	}

	dosya.close();
}

void main(string[] parametreler)
{
	dosyadanOku();
	readln();
}


Bu program doğru değerleri üretiyor Erdem hocamın dediği şekle ancak akşam dönüştürebilirim ancak readRaw okumaları benim bu şekilde yapılırsa doğru değerlerin çıktığını rahatlıkla söyleyebilirim

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2018

Soru soracak birşey bırakmamışsınız Ali Hocam..
Şimdi biraz mola.. Bunları bir özümseyip birkaç güne Gtkd ile uyumunu geliştireyim bakalım..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 25, 2018

Dosya düzeninin yeni halini gösteren bir kaynak var mı? numEntities'in her kayıt için tekrarlanıyor olması mantıklı gelmiyor çünkü hem gerek yoktur (dosyanın başından tek kere okunması yeter) hem de dosya boyutu açısından savurganlıktır çünkü aynı şey her kayıtta tekrarlanıyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2018

Birşey sormayacağım dedim ama yine rahat duramadım kısa bi vaktinizi daha alacağım;
sanki şu kodları yazmasakta 3956 kere yazdırıyor geldi bana

   foreach (entity; entities) {
       writefln("%s", entity);
   }

foreach içine bir statik değişken sayaç koyduğumda 3956 kere bunu döndürdüğünü görüyorum ama sayacı yapıların oraya dayerleştirdiğimde de bu sefer ordaki sayaçta 7912 kere çalışıyor :rolleyes: yani 7912 yapnın içinde 3956 da foreach içinde.. Belki okurken sorun yok ama acaba yazdırıkenmi var yoksa yine saçma sapan bir yerde birşeymi atlıyorum :nuts:

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2018

Ne diyorsunuz Ali hocam şaka mı yapıyorsunuz :blush: zaten benle uğraşmak bile hata yapılmaya müsait bir zemin hazırlar :-D
şimdilik kod böyle oldu;

import std.stdio;
import std.format;
import std.exception;

// Bkz: https://pmc.editing.wiki/doku.php?id=falcon4:file_formats:ct_file

align(1)
struct VuEntity {
	align(1):
   ushort id;
   ushort collisionType;
   float collisionRadius;
   ubyte[8] classInfo;
   uint updateRate;
   uint updateTolerance;
   float fineUpdateRange;
   float fineUpdateForceRange;
   float fineUpdateMultiplier;
   uint damageSeed;
   int hitpoints;
   ushort majorRevisionNumber;
   ushort minorRevisionNumber;
   ushort createPriority;
   ubyte managementDomain;
   ubyte transferable;
   ubyte private_;
   ubyte tangible;
   ubyte collidable;
   ubyte global;
   ubyte persistent;
   ubyte[3] padding;

   void toString(void delegate(const(char)[]) sink) const {
       formattedWrite(sink, "id             : %s\n", id);
		formattedWrite(sink, "collisionType  : %s\n", collisionType);
       formattedWrite(sink, "collisionRadius: %s\n", collisionRadius);
		formattedWrite(sink, "classInfo[0]   : %s\n", classInfo[0]);
		formattedWrite(sink, "classInfo[1]   : %s\n", classInfo[1]);
		formattedWrite(sink, "classInfo[2]   : %s\n", classInfo[2]);
		formattedWrite(sink, "classInfo[3]   : %s\n", classInfo[3]);
		formattedWrite(sink, "classInfo[4]   : %s\n", classInfo[4]);
		formattedWrite(sink, "classInfo[5]   : %s\n", classInfo[5]);
		formattedWrite(sink, "classInfo[6]   : %s\n", classInfo[6]);
		formattedWrite(sink, "classInfo[7]   : %s\n", classInfo[7]);
		formattedWrite(sink, "updateRate     : %s\n", updateRate);
       formattedWrite(sink, "updateTolerance: %s\n", updateTolerance);
		formattedWrite(sink, "fineUpdateRange: %s\n", fineUpdateRange);
		formattedWrite(sink, "fineUpdateForceRange  : %s\n", fineUpdateForceRange);
		formattedWrite(sink, "fineUpdateMultiplier  : %s\n", fineUpdateMultiplier);
		formattedWrite(sink, "damageSeed     : %s\n", damageSeed);
		formattedWrite(sink, "hitpoints      : %s\n", hitpoints);
       formattedWrite(sink, "revision       : %s.%s\n", majorRevisionNumber, minorRevisionNumber);
		formattedWrite(sink, "createPriority : %s\n", createPriority);
		formattedWrite(sink, "managementDomain  : %s\n", managementDomain);
       formattedWrite(sink, "transferable   : %s\n", transferable);
       formattedWrite(sink, "private        : %s\n", private_);
		formattedWrite(sink, "tangible       : %s\n", tangible);
		formattedWrite(sink, "collidable     : %s\n", collidable);
		formattedWrite(sink, "global         : %s\n", global);
		formattedWrite(sink, "persistent     : %s\n", persistent);
		formattedWrite(sink, "padding[0]     : %s\n", padding[0]);
		formattedWrite(sink, "padding[1]     : %s\n", padding[1]);
		formattedWrite(sink, "padding[2]     : %s\n", padding[2]);
   }
}

// Denetleyelim
static assert (VuEntity.sizeof == 60);

align(1)
struct Falcon4Entity {
	align(1):
   VuEntity vuClassData;
   short[7] visType;
   short vehicleDataIndex;
   ubyte dataType;
   uint dataPtr;

   void toString(void delegate(const(char)[]) sink) const {
       formattedWrite(sink, "%s", vuClassData);
       formattedWrite(sink, "visType         : %s\n", visType);
       formattedWrite(sink, "vehicleDataIndex: %s\n", vehicleDataIndex);
       formattedWrite(sink, "dataType        : %s\n", dataType);
		// Dosyadan okunan dataPtr anlamsızmış; yazdırmıyoruz
   }
}

// Denetleyelim
static assert ((Falcon4Entity[2]).sizeof == 81 * 2);

Falcon4Entity[] oku() {
   auto dosya = File("FALCON4.ct", "rb");

   short numEntities;
   auto okunanAdet = dosya.rawRead((&numEntities)[0..1]);
   enforce(okunanAdet.length == 1, "HATA: Adet değerini okuyamadım");

   auto entities = new Falcon4Entity[](numEntities);
   entities = dosya.rawRead(entities);
   enforce(entities.length == numEntities,
           format("HATA: %s yerine yalnızca %s nesne okudum", numEntities, entities.length));
   return entities;
}

int main(string[] args) {
   Falcon4Entity[] entities = oku();
	foreach (entity; entities) {
		writefln("%s", entity);
	}

   return 0;
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2018

peki dosyanın herhangi bir bytına imleçi götüren bir olanak yokmu ? yani bizi dosyanın bilmem kaçıncı baytına git imleç(sözde imleç) orda dursun birşeyler okurken bu imleçten okumaya başlasın gibi mesela ? çünkü niye sordum böylece sadece istediğim sıradaki kaydı tüm datayı okutmadan ekran getirebilirim. (Elbette başka bir konu bu yoksa program şu an için istediğim noktaya geldi)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 25, 2018

Ben baktım: Dosyanın başındaki iki bayt dosyanın içinde başka bir yerde geçmiyor. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2018

Öncelikle, FALCON4.ct dosyasını sonunda indirdim ve baktım.: internette bulduğumuz .ct dosya düzeni doğruymuş.

Alıntı (cos00kun):

>

Ali hocam numEntities zaten her kayıtta tekrarlanmıyor.

O zaman FALCON4_ct yapısında yer almamalı, değil mi? Çünkü FALCON4_ct "entity" dedikleri kavramı temsil ediyor ama entity adedi o kavramın parçası değil, onun dışında bir şey.

Alıntı:

>

ID tekrarlanıyor daha doğrusu hep aynı değeri alıyor ID.

Baştan bir sorun varmış gibi düşündük ama normal demek ki.

Alıntı:

>

Belki struct yapısının içinden çıkarsak sanki daha iyi bile olabilir

Evet! Lütfen! :)

Alıntı:

>

çünkü structun tüm elemanlarını birşekilde foreach yada for ile döndürürken ona tekrar bir atama yapmaması lazım yada hatalardan dahamı kaçınmış olurduk acaba bilemedim..

Daha önceki konuşmalarımızda FALCON4_ct yapısını dosyanın binary özelliğine uygun olarak ve tam tarifine göre tam 81 bayt olacak biçimde ayarlamıştık. (align olanağı doldurma baytları ile.)

O sayede bütün yapıyı tek rawRead ile okuyabiliyoruz. Ek olarak, eğer ileride dosyaya yazmak gerekirse yine tek rawWrite ile yazabilirsin. Senin yaptığın ise oldukça külfetli: hem çok uzun yazmışsın hem de her rawRead çağrısı için ayrı ayrı zaman harcanıyor.

Alıntı:

>

Bu program doğru değerleri üretiyor Erdem hocamın dediği şekle ancak akşam dönüştürebilirim ancak readRaw okumaları benim bu şekilde yapılırsa doğru değerlerin çıktığını rahatlıkla söyleyebilirim

Daha önce bilerek eksik bıraktığım programı tamamladım. O da seninki gibi doğru sonuç üretiyor:

import std.stdio;
import std.format;
import std.exception;

// Bkz: https://pmc.editing.wiki/doku.php?id=falcon4:file_formats:ct_file

align(1)
struct VuEntity {
align(1):
   ushort id;
   ushort collisionType;
   float collisionRadius;
   ubyte[8] classInfo;
   uint updateRate;
   uint updateTolerance;
   float fineUpdateRange;
   float fineUpdateForceRange;
   float fineUpdateMultiplier;
   uint damageSeed;
   int hitpoints;
   ushort majorRevisionNumber;
   ushort minorRevisionNumber;
   ushort createPriority;
   ubyte managementDomain;
   ubyte transferable;
   ubyte private_;
   ubyte tangible;
   ubyte collidable;
   ubyte global;
   ubyte persistent;
   ubyte[3] padding;

   void toString(void delegate(const(char)[]) sink) const {
       // Bu işlevin içeriği geliştirilebilir; kısa bırakıyorum
       formattedWrite(sink, "id             : %s\n", id);
       formattedWrite(sink, "[...]\n");
       formattedWrite(sink, "updateRate     : %s\n", updateRate);
       formattedWrite(sink, "updateTolerance: %s\n", updateTolerance);
       formattedWrite(sink, "[...]\n");
       formattedWrite(sink, "revision       : %s.%s\n", majorRevisionNumber, minorRevisionNumber);
       formattedWrite(sink, "transferable   : %s\n", transferable);
       formattedWrite(sink, "private        : %s\n", private_);
       formattedWrite(sink, "[...]\n");
   }
}

// Denetleyelim
static assert (VuEntity.sizeof == 60);

align(1)
struct Falcon4Entity {
align(1):
   VuEntity vuClassData;
   short[7] visType;
   short vehicleDataIndex;
   ubyte dataType;
   uint dataPtr;

   void toString(void delegate(const(char)[]) sink) const {
       formattedWrite(sink, "%s", vuClassData);
       formattedWrite(sink, "visType         : %s\n", visType);
       formattedWrite(sink, "vehicleDataIndex: %s\n", vehicleDataIndex);
       formattedWrite(sink, "dataType        : %s\n", dataType);
       // Dosyadan okunan dataPtr anlamsızmış; yazdırmıyoruz
   }
}

// Denetleyelim
static assert ((Falcon4Entity[2]).sizeof == 81 * 2);

Falcon4Entity[] oku(string dosyaİsmi) {
   auto dosya = File(dosyaİsmi, "rb");

   short numEntities;
   auto okunanAdet = dosya.rawRead((&numEntities)[0..1]);
   enforce(okunanAdet.length == 1, "HATA: Adet değerini okuyamadım");

   writefln("%s adet nesne okuyorum", numEntities);

   auto entities = new Falcon4Entity[](numEntities);
   entities = dosya.rawRead(entities);
   enforce(entities.length == numEntities,
           format("HATA: %s yerine yalnızca %s nesne okudum", numEntities, entities.length));
   return entities;
}

int main(string[] args) {
   if (args.length != 2) {
       stderr.writefln("Kullanım: %s <dosya ismi>", args[0]);
       return 1;
   }

   Falcon4Entity[] entities = oku(args[1]);

   writefln("Elimde %s adet nesne var: %s", entities.length, entities);

   foreach (entity; entities) {
       writefln("%s", entity);
   }

   return 0;
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2018

Bütün elemanlar burada 'entities' olarak yazdırılıyorlar:

   writefln("Elimde %s adet nesne var: %s", entities.length, entities);

Bir kere de burada:

   foreach (entity; entities) {
       writefln("%s", entity);
   }

Çabucak yazdığımız kodlarda böyle gariplikler olabiliyor. :/

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]