January 18, 2018

'saatler''in elemanlarının döngüden sonra bile hep 0:0:0 değerinde olmalarının nedeni, benim de hâlâ düştüğüm bir hata: foreach elemanları ref olarak almıyor. :) Şöyle değiştirilebilir:

   foreach(ref saat; saatler)
   {
       // ...
   }

Ali

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

January 19, 2018

Sağolun hepiniz..
evet benzer konular ama aslında benim daha öncede yazdığım gibi asıl amacım bir uçuş simülasyonu oyunundaki bir dosyada tutulan bazı verileri (binary dosya) alıp bir ListBox üzerinde bunları değiştirmek güncelmemek vesaire ( http://ddili.org/forum/thread/1764 )... Bu amaç için öncelikle Özellikle Erdem hocanın yardımlarıyla GtkD kütüphanesini öğreniyorum.. Açıkçası eh işte işlerimi görecek kadar bir yol aldım da. Şimdi Dosyadan bunları almak ve işlemekle ilgili D dilinde eksik kaldığım bölümlere odaklanıyorum.

Burada bu verileri Bir yapı olarak belirlenmiş değişkenlere tek tek atamak lazım diye çıktık yola.. yani şöyle dosyadaki her 81 bytlık veriyi bir yapıda tanımladığım 81 adet değişkene atayacağım.. Şimdi bunu aslında yapmak çok zor değil dosyadan alıp byte olarak okutabiliyorum ancak ben bunu hiç uğraşmadan foreach() işlevinin otomatik olarak struct yapısındaki değişkenlere atamasını bekledim yani ben foreach() a al kardeşim yapı ismi şu diyecektim oda aslında yapının içindeki tüm değişkenleri sırayla döndürecekti ama işler umduğum gibi olmadı burda son yazılanları okuyana kadar ;-) yoksa 'yapıNesnesiİsmi.değişkenİsmi' ile bunları zaten yaptırabiliyorum..

Sonuç olarak anladımki bazı yazılanları belki anlamak değil ama kavrayabilmek için D dilinde birazdaha ilerlemem ve Kitaptan okumaya devam etmem gerekiyor.. Bazan C++ de öğrendiklerim aslında birçok konunun benzer olmasına rağmen yaklaşım farklılıkları olması sebebiyle D dilinde herşeyi silbaştan Kavramak çok önemli ..

sevgi ve saygılarımla

***Edit: Yukarıda ".....81 adet değişkene atayacağım...." yazmışım bu yanlış çünkü bazı değişkenler ushort bazı değişkenler byte[8] .. o yüzden toplam 81 adet değişken yok. 81 adet byte belli sayıda Değişken var.. Bu düzeltmeyiğde ekleyeyeim :blush: ***

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

January 19, 2018
import std.stdio;
import std.string;
import std.file;

struct Falcon4 {
	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;
	byte[3] padding;
	short[7] visType;
	short vehicleDataIndex;
	byte dataType;
	uint dataPtr;
}

void main(string[] parametreler)
{
	File dosya = File ("FALCON4.ct", "rb" );
	Falcon4[1] falcon4;
	foreach(elemanlar;dosya.rawRead(falcon4[0..$])) {
		write(elemanlar);
	}
	dosya.close();
	readln();
}

aslında ben burada sadece 'foreach()' işlevine biraz hayıflanıyorum :-) gariptirki 'Falcon4' yapısından türetilen 'falcon4 'nesnesinin elemanlarını direkt olarak döndüremeyen 'foreach()' , Aynı yapıdan dizi olarak üretilen 'falcon4' nesne dizisini döndürebiliyor.:-p Sorun yok yola devam..

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

January 19, 2018

üstad bunu çözmüş (Ali hocam) :-) Buradan işi çözüyorum artık

import std.stdio;
import std.string;
import std.exception;

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

align(1)
struct VuEntity {
	align(1):
	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;
	byte[3] padding;
}

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

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

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

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

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

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

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

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

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

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

	return 0;
}

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

January 19, 2018

peki Ali hocam biraz basit gibi görünsede bu değişkenleri bir yapı yerine direk dizi olarak kullanarak içlerine okutsak ( çünkü nasılsa GtkD ile listBox üzerinde üzerlerinden direk işlem yapacağız) programcılık açısından çokmu basit kaçar ? biraz açarsak yapıda tanımladığımız değişkenlerin her birini dizi olarak tanımlasak ve dosyadan onlara okuma yapsak ki foreach() işlevi bunu pekala rahat halledebiliyor mesela ? maliyetini kestiremiyorum ama sanki bazan düşük seviyede öğrendiğimiz basit konular çok kargaşaya neden olmadan işlerimizi halledebilir diye geçiverdi aklımdan elbette bir amatör olarak :blush:

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

January 19, 2018

Ah evet dizilerdeki o temel kuralı unutmuşum

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

January 19, 2018

Burada iki yakın konu oluştu: Birincisi, Coşkun'un sorunu olan falcon4 dosya düzenini okumak. Yukarıdaki koddaki bağlantıdaki bilgilere göre yazdığım yöntemin hataları olabilir ama temelde doğru: falcon4 nesneyi bellekten olduğu gibi yazıp okuduğundan rawRead ve rawWrite yöntemi kullanılıyor.

Daha genel olarak, üyeleri kaydedip tekrar okuma olayına serialization+deserialization deniyor. Bunu yapan bir kaç tane D modülü var. code.dlang.org'da "serialization" diye aratınca şunlar çıkıyor:

http://code.dlang.org/search?q=serialization

Kendim için bir yöntem düşünsem ve okuma yazma olayının çok hızlı olması gerekmese (örneğin, yalnızca programın başında tek kere okunacaktır), ben o modüllerden birisini kullanırdım. Örneğin, nesne json veya yaml düzeninde yazdırıldığında metin düzenleyicimde açtığımda herşeyi basitçe görebilirdim ve gerektiğinde değiştirebilirdim.

Ek olarak, o modüllerin çoğunun __traits(allMembers), __traits(getMember), ve UDA olanaklarını kullandığından eminim.

Ali

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

January 19, 2018

Dizi elemanları aynı türden olmak zorundadır. O yüzden, bunu ancak bütün üyeleri aynı türden olan yapılarda kullanabiliriz. Bir başka deyişle, yapı yerine dizi kullanırız.

Ali

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

January 20, 2018

Aslında daha önce C/C++ ile bu işlemi şu şekilde rahatça hallediyordum

function CT_data = readCtDataSequentially(path_DB)

CT_data = struct('Id',               NaN, ...
                'CollisionType',    NaN, ...
                'CollisionRadius',  NaN, ...
                'Domain',           NaN, ...
                'Class',            NaN, ...
                'Type',             NaN, ...
.......
.......

yapı tanımından sonra;

.........
.........
fid = fopen(sprintf('%s\\FALCON4.CT', path_DB));

if (fid ~= -1)
   number_of_items = fread(fid, 1, 'uint16');

   for i = 1:1:number_of_items
       CT_data(i).Id               = fread(fid, 1, 'uint16');
       CT_data(i).CollisionType    = fread(fid, 1, 'uint16');
       CT_data(i).CollisionRadius  = fread(fid, 1, 'float32');
       CT_data(i).Domain           = fread(fid, 1, 'uint8');
       CT_data(i).Class            = fread(fid, 1, 'uint8');
       CT_data(i).Type             = fread(fid, 1, 'uint8');
       CT_data(i).SubType          = fread(fid, 1, 'uint8');
..........
..........

yapılacak iş kısaca bunun D ye uyarlanmış hali.. yarın bir çalışma yapacağım tüm yazılanları arkama alarak bakalım ne becerebileceğim :-)

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

January 20, 2018

Yapı olayından vazgeçersek eğer (Sonra tekrar kullanmak kaydıyla)

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

void main(string[] parametreler)
{
	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;
   byte[3] padding;
   short[7] visType;
   short vehicleDataIndex;
   byte dataType;
   uint dataPtr;

	File dosya = File ("FALCON4.ct", "rb" );

	numEntities = dosya.rawRead(new short[1])[0];
	id = dosya.rawRead(new ushort[1])[0];
	collisionType = dosya.rawRead(new ushort[1])[0];
	collisionRadius = dosya.rawRead(new float[1])[0];
	writeln("Num Entities= ",numEntities);
	writeln("Id= ",id);
	writeln("Collision Type= ",collisionType);
	writeln("Collision Radius= ",collisionRadius);
	//............
	//............
	//............
   dosya.close();
   readln();
}

çıktısı;

	Num Entities= 3956
	Id= 60395
	Collision Type= 0
	Collision Radius= 0

şimdi bunları 3956 adet diziye döndürdüğümde en azından amacıma belki acemi birr yol olsada ulaşmış oldum.. yarın programı olgunlaştıracağım hadi hayırlsısı bakalım.. Bu arada her türlü itiraz ve eleştiri için beklemekteyim :-p

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