string in ram'de kapladığı alanı nasıl bulurum?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
string in ram'de kapladığı alanı nasıl bulurum?
bir string im var mesela 'ahmet' bunun ram de kapladığı alan bulmak için sizeof('ahmet') yazıyorum sonuç 4 çıkıyor, sizeof('asfAagDGSDGASDFAF') yazıyorum sonuç yiine 4 çıkıyor. kapladığı boya göre getmem le yer ayırmam gerekiyor da. bir de ram e yazarken string in sonuna null ekliyor mu yoksa benim mi eklemem gerekiyor?
öğrenmek, zorlukları yenmektir.
Selamlar,
4 çıkmasının sebebi, adres gösterdiği için olması lazım. Yani yazdığınız değişkenin adresi 4 byte olarak düşünün. Bunun yerine String'in boyunu bulun Length'i kullanın. Getmem ile o kadar yer ayırın.
Kolay Gelsin
4 çıkmasının sebebi, adres gösterdiği için olması lazım. Yani yazdığınız değişkenin adresi 4 byte olarak düşünün. Bunun yerine String'in boyunu bulun Length'i kullanın. Getmem ile o kadar yer ayırın.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
SizeOf('Ahmet') diyerek stringin bellekte ayırdığı yeri gösteren pointer'ının büyüklüğüne ulaşırsın. Kuri_TLJ'nin dediği gibi Length kullanmalısın.
String'lerin sonuna null eklemen gerekmez. Bu kural sadece PChar veri tipleri için geçerlidir. Delphi string boyutunu ayrı bir tabloda tutar. Sonundaki #0'ı göze almaz.
String'lerin sonuna null eklemen gerekmez. Bu kural sadece PChar veri tipleri için geçerlidir. Delphi string boyutunu ayrı bir tabloda tutar. Sonundaki #0'ı göze almaz.
string in boyunu length ile bulup ram de o kadarlık yer ayırıp yazıvorum. ama ram'e önce stringin kaç karakterden oluştuğunu yazıyor. mesela
A karakterini ram e atmak için 2 baytlık yer açmam gerekiyor. ramde önce stringin boyunu yazıyor sora string i yazıyor. veya ahmet yazacam b baytlık yer açıyorum önce 5 yazıyor sonra a, h ,m, e, t yazıyor. Sanırım bu delphi den kaynaklanıyor. saptamam doğru mu yoksa benim kodda mı bir arıza var
A karakterini ram e atmak için 2 baytlık yer açmam gerekiyor. ramde önce stringin boyunu yazıyor sora string i yazıyor. veya ahmet yazacam b baytlık yer açıyorum önce 5 yazıyor sonra a, h ,m, e, t yazıyor. Sanırım bu delphi den kaynaklanıyor. saptamam doğru mu yoksa benim kodda mı bir arıza var
öğrenmek, zorlukları yenmektir.
string tipleri delphi'ye özel tiplerdir ve bellek yönetimini compiler yapar.
stringlerde bellekte yer ayırmak için Setlength kullanılır GetMem değil.
string için ayırılan bellek iş bittikten sonra otomatik free edilir.
string tiplerde çalışırken Getmem ile işlem yapmamalısın. Bunun için string yerine PChar kullanman uygun olacaktır.
Getmem i neden kullanıyorsun? Tam olarak ne yapmak istiyorsun. Bunu yazarsan daha fazla yardımcı olunabilir. String kullanımında yanlış yolda olduğunu söylemem gerekli.
stringlerde bellekte yer ayırmak için Setlength kullanılır GetMem değil.
string için ayırılan bellek iş bittikten sonra otomatik free edilir.
string tiplerde çalışırken Getmem ile işlem yapmamalısın. Bunun için string yerine PChar kullanman uygun olacaktır.
Getmem i neden kullanıyorsun? Tam olarak ne yapmak istiyorsun. Bunu yazarsan daha fazla yardımcı olunabilir. String kullanımında yanlış yolda olduğunu söylemem gerekli.
Selamlar,
Pascal'dan kalma bir şeydir bu. Pascalda Stringler 255 Byte'tan oluşurdu ve 0. Byte'ı String'in uzunluğunu tutardı ama bu olay sonraları değiştirildei (Delphi'de)
Siz pointer ile tutup, bellek bölgesi ayırması işlemi yapacaksınız. Bu sebeple sizin uzunluğa ihtiyacınız yok (Yani stringin önünde bu bilgiye ihtiyaç yok) siz verinizi String olarak tutmamalısınız. Pointerlarla işlem yapmalısınız. Eğer Getmem Kullanmak İstiyorsanız.
Kolay Gelsin
Pascal'dan kalma bir şeydir bu. Pascalda Stringler 255 Byte'tan oluşurdu ve 0. Byte'ı String'in uzunluğunu tutardı ama bu olay sonraları değiştirildei (Delphi'de)
Siz pointer ile tutup, bellek bölgesi ayırması işlemi yapacaksınız. Bu sebeple sizin uzunluğa ihtiyacınız yok (Yani stringin önünde bu bilgiye ihtiyaç yok) siz verinizi String olarak tutmamalısınız. Pointerlarla işlem yapmalısınız. Eğer Getmem Kullanmak İstiyorsanız.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
compiler benzeri bir program yazıyorum. hazırladığım programdaki hazırlanan pencereler plc içerisine atılıp çalıştırılacak. bir label toolu hazırladım. label'in textini şu şekilde saklıyorum.
type
GUI_dtstringptr=^GUIdtstring;
GUIdtstring= packed record
dataformat:word;
defdataindex:word;
netadr:byte;
data:shortstring;
null:byte;
end;
ve programda label a girilen text bu formata çevriliyor. labela yazılan texti de ram e data ile kaydediyorum. label a yazılabilecek text boyu maksimum 32 karakter. ama string için 32 bayt ayırmıyorum bitiminde nul yazıyorum.
i:=5+length(datas)+2;
Getmem(DTStringptr,i);
DTStringptr^.dataformat:=$0400;
DTStringptr^.defdataindex:=$0050;
DTStringptr^.netadr:=$00;
DTStringptr^.data:='label01';
DTStringptr^.null:=$0;
DataTable[DTCount]:=DataOffset;
diye devam ediyor
i değişkenindeki 5 dataformat(2), defdataindex(2),netadr(1) için ayrılan yer. lenght(datas) text için ayrılan yer. 2 bayt a ise 1 bayt textin boyunu yazıyor delphi diğerine ben nul atıyorum plc onu string in bittiğini anlamak için okuyor.
type da tanımladığım data tipini pchar ile tanımlarsam daha mı iyi olur?
type
GUI_dtstringptr=^GUIdtstring;
GUIdtstring= packed record
dataformat:word;
defdataindex:word;
netadr:byte;
data:shortstring;
null:byte;
end;
ve programda label a girilen text bu formata çevriliyor. labela yazılan texti de ram e data ile kaydediyorum. label a yazılabilecek text boyu maksimum 32 karakter. ama string için 32 bayt ayırmıyorum bitiminde nul yazıyorum.
i:=5+length(datas)+2;
Getmem(DTStringptr,i);
DTStringptr^.dataformat:=$0400;
DTStringptr^.defdataindex:=$0050;
DTStringptr^.netadr:=$00;
DTStringptr^.data:='label01';
DTStringptr^.null:=$0;
DataTable[DTCount]:=DataOffset;
diye devam ediyor
i değişkenindeki 5 dataformat(2), defdataindex(2),netadr(1) için ayrılan yer. lenght(datas) text için ayrılan yer. 2 bayt a ise 1 bayt textin boyunu yazıyor delphi diğerine ben nul atıyorum plc onu string in bittiğini anlamak için okuyor.
type da tanımladığım data tipini pchar ile tanımlarsam daha mı iyi olur?
öğrenmek, zorlukları yenmektir.
Böyle bir yapı için Array[0..31] of Char olarak ayırman bence en iyisi. Ne bellek ayırma ile uğraş ne free etme ile. Anlıyorum RAM'i en iyi kullanmak istiyorsun ancak bu sefer de bellek allocate ve free için bir sürü kod yazıp aynı hesaba getiriyorsun. Hem de çok sağlam olmuyor, hem de extra uğraşıyorsun.
Yani diyeceğim record size'ını fixle. stringe göre değişmesin. bu şekil sana çok kolaylık sağlayacak.
Yani diyeceğim record size'ını fixle. stringe göre değişmesin. bu şekil sana çok kolaylık sağlayacak.