procedure parametre

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
egedenizi
Üye
Mesajlar: 38
Kayıt: 25 May 2005 02:01

procedure parametre

Mesaj gönderen egedenizi »

Merhabalar...
Bir konuyu danışmak istedim.
Benim bu biçimde procedurum var.


Type
a=array of integer;
b=array of a;

procedure dene(d:b);

var
dizi:b;

begin
dizi:=d;
dizi[0][0]:=5;

end;

Burada diziye 5 atadığımda d parametreside 5 atanıyor.yani ikiside eşitleniyor. Bunu nasıl çözebilirim Teşekkürler....
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Yapmak istediğiniz ne peki?
egedenizi
Üye
Mesajlar: 38
Kayıt: 25 May 2005 02:01

Mesaj gönderen egedenizi »

Gelen parametreye göre diziye ekleme yapmak istiyorum.Ama parametrede degistiginden sonuc faydasız oluyor.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

değişkenleriniz dynamic array olduğundan bunu yapıyor. Dizileri direk bir birine eşitlerseniz verileri aktarmak yerine pointerlarını bir birine eşitler. bunu yapmasını istemiyorsanız dizinin içeriğini döngülerle aktarın.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
aynı şey fontlarla uğraşırken benimde başıma gelmişti.
@mkysoft un dediği gibi pointerları eşitlediği için ikisidedeğişiyordu.
ben assign metodunu kullanarak halletmiştim.

Kod: Tümünü seç

font.assign(yenifont)
gibi bir şey kullanmıştım.
belki işinize yarar.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

şunu bir deneyebilr misin?

procedure dene(const d:b);
begin
.
.
.
end;

neticeyi bilmiyorum ama faydası olabileceğini düşündüm..
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Dinamik Kopya Oluştur

Mesaj gönderen sabanakman »

prosedür içinde parametre ile gelen diziyle aynı özellikte başka bir dizi oluşturmaktan başka çaren yok. dizi:=b satırı yerine aşağıdaki kodu kullan.

Kod: Tümünü seç

procedure dene(d:b);
var dizi:b; i,j,x,y:Integer;
begin
  //dizi:=d; yerine
  x:=high(d);
  y:=high(d[0]);
  SetLength(dizi,x+1,y+1);
  for i:=0 to x do
   for j:=0 to y do
    dizi[i][j]:=d[i][j];
  //bu satırları kullanırsan bağımsız bir kopya elde edersin.
  ..
  dizi[0][0]:=5;//bu diğer diziyi etkilemez
  ..
  SetLength(dizi,0,0);dizi:=nil;{işin bitince hafızadan aldığın yeri iade etmen gerekir}
end;
.. ile olan yerlerde dizi değişkeni üzerinde bağımsız olarak istediğin gibi çalışabilirsin. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

memcopy gibi birşeyle daha hızlı kopyalanabilir düşüncesindeyim.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Murat DİCLE yazdı:memcopy gibi birşeyle daha hızlı kopyalanabilir düşüncesindeyim.
Hocam buda pek mümkün değil çünkü b tipi array a tipi arrayların pointerlarını tutuyor. d arrayını memcopy yapsak bile pointerları kopyalamış olacak. Yine parametreyle gelen arrayla paylaşmış olacaz aynı değerleri. Belki arrayın 2.boyutu memcpy ile copyalanmış arraylara eşitlenebilir. Buda performans açısından çok farkedermi denemek lazım. Çünkü sonuçta bir fonksiyona call yapılıyor çok defa bu yöntemlede. @sabanakman'ın yöntemi en iyi yöntem gibi.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

undefined yazdı:
Murat DİCLE yazdı:memcopy gibi birşeyle daha hızlı kopyalanabilir düşüncesindeyim.
Hocam buda pek mümkün değil çünkü b tipi array a tipi arrayların pointerlarını tutuyor. d arrayını memcopy yapsak bile pointerları kopyalamış olacak. Yine parametreyle gelen arrayla paylaşmış olacaz aynı değerleri. Belki arrayın 2.boyutu memcpy ile copyalanmış arraylara eşitlenebilir. Buda performans açısından çok farkedermi denemek lazım. Çünkü sonuçta bir fonksiyona call yapılıyor çok defa bu yöntemlede. @sabanakman'ın yöntemi en iyi yöntem gibi.
Doğru söylüyorsun. Dizi içinde dizi olunca hafızadaki yerleri farklı olabilir. Sıradan gitmeyebilir. Ama belki tek bir diziyi kopyalamak söz konusu olabilir buda ne kadar gerekli ya da ne kadar performans sağlar tartışılır.
Cevapla