pointer la ilgili bir deneme

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

pointer la ilgili bir deneme

Mesaj gönderen cfyasar »

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;
öğrenmek, zorlukları yenmektir.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kod: Tümünü seç

new(editptr); 
ile bellekte yer ayırman lazım. yani kod şoyle olmalı;

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

Mesaj gönderen cfyasar »

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.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

adres editptr icinde tutuluyor 4 byte olarak
integer tipine cevirerek gorebilirsin
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

New() proceduru nün helpine bakarsan GetMem(..) diye bir bir precedure var belki işine yarar..
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

editptr ptr tipinde olduğu için integer a veya string e çeviremiyorum. mesela editptr yi okuyabilmek için ptr yi ptr=^integer; tanımlarsam. myedit recordu ile nasıl bağlantı sağlayabilirim?
öğrenmek, zorlukları yenmektir.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ShowMessage(IntToHex( Integer(editptr),8 ));
seklinde bi dene istersen
ÜŞENME,ERTELEME,VAZGEÇME
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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:

Kod: Tümünü seç

  New(Ptr);
  try
    ..
  finally
    Dispose(Ptr);
  end;
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

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

Mesaj gönderen cfyasar »

@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.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

şunu deneyebilirsin, ama olucağından pek emin değilim

Kod: Tümünü seç

Move(list.items[1]^, label1, sizeof(Tlabel))
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

yukarıdaki örnekte editptr benim recordumun başlangıç adresini tutuyor. ben o adresten byte byte bilgi okumak istiyorum. bunu nasıl yapacağım.
x:=byte;

x:=editptr^;
kodu çalışmıyor, tip hatası veriyor.
öğrenmek, zorlukları yenmektir.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Bunu yapabilmek için birkaç yol var.

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;
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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;
Cevapla