Alıntı (Salih Dinçer):
>(*) Eğer 'foreach()' önüne yapının kopyasını birbirine eşitlemezseniz (baştaki = sonraki;) çalışma zamanı hatası verecektir!
Neden?
Doğrusu ikinci mesajını okuyana kadar baştaki = sonraki; satırını bulamamıştım. İkinci mesajı okuyunca ilgili satırı gördüm ve incelmeye başladım. Kodu kendimce yeniden şöyle düzenledim;
import std.stdio;
import std.string;
import std.conv;
struct Atom
{
Atom* element; // Eğer adres değeri F70 ile bitiyorsa,
ubyte proton; // 2. eleman türden bağımsız F74 oluyor
this(Atom* a, ubyte b)
{
this.element = a;
this.proton = b;
}
void atomuEkle(ref Atom* sonraki, ubyte değeri)
{
auto ekle = new Atom(null, değeri);
sonraki.element = ekle;
sonraki = ekle;
}
string toString() const
{
string tamami = format("%X -> %d", &proton, proton);
if (element) tamami ~= "\n" ~ to!string(*element);
return tamami;
}
}
void main ()
{
Atom* bastaki;
Atom* sonraki = new Atom(null, 1); // Hidrojen (en basit element!)
bastaki = sonraki;
foreach(ubyte atomNumarasi; 2..4)
{
sonraki.atomuEkle(bastaki, atomNumarasi);
}
writeln(to!string(*sonraki));
}
Öncelikle hatayı tespit edelim. Buradaki hata aşağıdaki metotda bulunan sonraki.element = ekle; satırından kaynaklanıyor.
void atomuEkle(ref Atom* sonraki, ubyte değeri)
{
auto ekle = new Atom(null, değeri);
sonraki.element = ekle;
sonraki = ekle;
}
Bu metotda (sonraki.element = ekle;) satırında sonraki isimli göstergenin gösterdiği yapının element üye değişkenine ekle isimli düğümü aktarmak istiyorsun. Peki sonraki göstergesi nereden geliyor bakalım;
foreach(ubyte atomNumarasi; 2..4)
{
sonraki.atomuEkle(bastaki, atomNumarasi);
}
sonraki göstergesi aslında main() içinde tanımlanmış bastaki göstergesinin ta kendisi. Peki bastaki değişkeni bir düğümü gösteriyormu, eğer bastaki=sonraki; ataması yapılmamışsa tabi ki hayır.
İşte senin baştaki = sondaki; ataması ile yaptığın null olan bastaki göstergesine bir düğüm atamak ve dolayısıyla ilerleyen satırlarda bu düğüme ekleme yaparken üye değişkenlere ulaşabilme imkanına kavuşmak.
Biraz karıştırdım farkındayım :) Kısaca null olarak gönderdiğin bir değerden dolayı olay karışıyor.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]