string in ram'de kapladığı alanı nasıl bulurum?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

string in ram'de kapladığı alanı nasıl bulurum?

Mesaj gönderen cfyasar »

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.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

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
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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.
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

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
öğrenmek, zorlukları yenmektir.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

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
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

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?
öğrenmek, zorlukları yenmektir.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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.
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

ram üzerinde işlem yapmaya mecburum çünkü plc ye gönderilecek bilgilerin hepsini ram de belirli bir düzende sıralayıp gönderiyorum. örnekteki label bilgisinide o şekilde oluşturup Allocmem ile ayırdığım 128 k'nın içine atıyorum. en son o 128 k'yı yolluyorum.
öğrenmek, zorlukları yenmektir.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

RAM üzerinde işlem yapma demiyorum. string olarak kullandığın bölümün size'ını 32'de sabitle. array olarak işlem görsün. sonuna #0 eklediğinde bir PChar olacaktır. string'e dönüştürmen çok kolay olacaktır.
Cevapla