pointer la ilgili bir deneme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
pointer la ilgili bir deneme
aşağıdaki kodu çalıştırdığımda access violation hatası alıyorum. nedenini çözemedim?
procedure TForm1.Button1Click(Sender: TObject);
type
ptr=^myedit;
myedit=record
adi:string[15];
sol:integer;
ust:integer;
gen:integer;
yuk:integer;
end;
var
editptr:ptr;
begin
editptr^.adi:='cem';
editptr^.sol:=10;
editptr^.ust:=25;
editptr^.gen:=50;
editptr^.yuk:=20;
ShowMessage(editptr^.adi);
end;
procedure TForm1.Button1Click(Sender: TObject);
type
ptr=^myedit;
myedit=record
adi:string[15];
sol:integer;
ust:integer;
gen:integer;
yuk:integer;
end;
var
editptr:ptr;
begin
editptr^.adi:='cem';
editptr^.sol:=10;
editptr^.ust:=25;
editptr^.gen:=50;
editptr^.yuk:=20;
ShowMessage(editptr^.adi);
end;
öğrenmek, zorlukları yenmektir.
Kod: Tümünü seç
new(editptr);
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
type
ptr=^myedit;
myedit=record
adi:string[15];
sol:integer;
ust:integer;
gen:integer;
yuk:integer;
end;
var
editptr:ptr;
begin
new(editptr);
editptr^.adi:='cem';
editptr^.sol:=10;
editptr^.ust:=25;
editptr^.gen:=50;
editptr^.yuk:=20;
ShowMessage(editptr^.adi);
end;
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
sorunum çözüldü teşekkürler. ufak bir sorum daha olacaktı. new(editptr) ile bellekte bir yer ayırıyorum ve bu adrese sırayla değişkenlerimi adi, sol, üst .. değerlerini yazıyorum. bu ayırdığım adresin başlangınını nasıl öğrenebilirim. yani benim değerlerimin yazıldığı adresin başlangıç değeri nedir. sonuç olarak editptr bu adresi tutuyor ve showmessage(editptr) gibi bir komutla adresi görebilir miyim?
öğrenmek, zorlukları yenmektir.
New ile ayırdığınız belleği Dispose ile geri vermeyi unutmayın.
GetMem ile ayırdığınızı da FreeMem ile geri vermelisiniz.
Örnek:
GetMem ile ayırdığınızı da FreeMem ile geri vermelisiniz.
Örnek:
Kod: Tümünü seç
New(Ptr);
try
..
finally
Dispose(Ptr);
end;
Bu record tipini, pointerlarla çokkez hafızaya kaydetmek içinse viewtopic.php?p=39492 'da konuşulan mesele için attığım örneği inceliyebilirsin.
@undefined verdiğin örnekteki gibi birşey yapıyorum. daha doğrusu yapmıştım ama label bilgilerini pointer la değil normal değişkenlerle tutuyordum sizin örnek çok iyi oldu. bir sorum daha olacak. Tlistte tuttuğum labellardan birini ramde başka bir adrese taşımam gerekiyor. bunu nasıl yapabilirim?
öğrenmek, zorlukları yenmektir.
şunu deneyebilirsin, ama olucağından pek emin değilim
Kod: Tümünü seç
Move(list.items[1]^, label1, sizeof(Tlabel))
Bunu yapabilmek için birkaç yol var.
Bunlardan birisi:
Bunlardan birisi:
Kod: Tümünü seç
type
PRecord = ^TRecord;
TRecord = record
No1: Integer;
No2:Integer;
end;
var
RecordPtr: PRecord;
Index: Integer;
ByteRead: Byte;
begin
GetMem(RecordPtr, SizeOf(TRecord));
try
RecordPtr^.No1:= 256;
RecordPtr^.No2:= 2;
for Index:= 0 to SizeOf(TRecord) - 1 do
begin
// Burada bellekten değerleri almak için pointer'i önce
// Integer'e çeviriyoruz ki bellek adreslerini for döngüsündeki
// Index değeri kadar arttırıp sonraki değeri alabilelim.
// Daha sonra yeniden Pointer'e dönüştürüp dönen değeri Byte
// tipine dönüştürüyoruz.
// Byte okumak için 1'er arttırmamız , Word okumak için 2 arttırmamız
// gerekir
ByteRead:= Byte(Pointer(Integer(RecordPtr) + Index)^);
// Memo içine değerleri yazalım
Memo1.Lines.Append(IntToStr(ByteRead));
end;
finally
FreeMem(RecordPtr);
end;
end;
Diğer bir yaklaşım Move kullanarak değerleri doğrudan aktarmaktır. Bir önceki örneğin sadece for döngüsü değiştirildi.
Kod: Tümünü seç
for Index:= 0 to SizeOf(TRecord) - 1 do
begin
// Move ile ByteRead değişkenine bellekten kopyalama yapıyoruz
Move(Pointer(Integer(RecordPtr) + Index)^, ByteRead,
SizeOf(ByteRead));
// Memo içine değerleri yazalım
Memo1.Lines.Append(IntToStr(ByteRead));
end;