Thread overview
D 'de göstericelerden kaçamamak
Jul 06, 2019
kerdemdemir
Jul 07, 2019
kerdemdemir
Jul 07, 2019
kerdemdemir
Jul 07, 2019
kerdemdemir
July 06, 2019

Merhaba,

import std.stdio;
import std.algorithm;

void main()
{
   struct C{
   	string name;
   }
   C[string] aa;

   bool constructed;
   auto a =   aa.require("a", { constructed=true; return C(); }());
   a.name = "erdem";
   writeln(aa);
}

writeln(aa); ben ["a":C("erdem")] yazdırmasını bekliyorum. Fakat sonuç boş küme çıkıyor.

Require yeni bir C yapısı oluşturuyor ve auto a = aa.reqiure.. dediğimiz "a" kopyalanıyor ve a.name = "erdem" satırı kopyayı değiştiriyor.

Referans yapayım şunu desek D'de ref anahtar kelimeside sadece foreach'de kullanılabiliyor.

Ben sonuçda şunu yapmak durumunda kalıyorum:

C* a = &aa.require("a", { constructed=true; return C(); }());

Adres alma operatörüde , gösterici kullanmakta hoşuma gitmesede bunları kullanmak zorunda kalıyorum.

require ile ilk tecrübelerim böyle oldu ne yazıkki. Pointer kullanmadan ve yapıyı sınıfa dönüştürmeden nasıl çözebilirdim acaba fikriniz var mı ?

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2019

Ali Abi

D şunu niye derlemiyor:

ref C a = aa.require("a", { constructed=true; return C(); }());

Ne yaptı referanslar D'yede kısıtlandılar böyle?

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2019

Require 'ı çözmeme rağmen çok benzer bir sepebten kod düzgün çalışmıyormuş durum şöyle özetlenebilir:


import std.stdio;
import std.algorithm;
import std.string;

struct C{
   int[string] temp;
}

void foo( C* inC )
{
   int[string] temp = inC.temp; // --> su satır burda olmasa benim kodumda çok uzun değişkene atamak istiyorum
   temp["erdem"] = 5;
   //inC.temp["erdem"] = 5; // Bu çalışıyor
}

void main()
{

   C c;
   foo(&c);
   writeln(c);
}

Burda göstergelerlede çıkamadım işin içinden amacım temp["erdem"] = 5; 'ın çalışması.

Fikriniz var mı ?
Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 06, 2019

Evet, yerel değişken referansı alınamadığından gösterge kullanmak gerekiyor. Tabii bu require'a özel değil; ref döndüren her işlev için geçerli:

int i;

ref foo() {
 return i;
}

void main() {
 auto kopya = foo();
 kopya = 42;
 assert(kopya == 42);
 assert(i == 0);

 foo() = 43;    // Bunu yapabiliyoruz ama garip görünen ve pek bilinmeyen bir olanak...
 assert(i == 43);
}

Bu durumda require'ın aslında gösterge döndürecek biçimde tasarlanmış olmasının daha doğru olacağı görülüyor çünkü '"a" in aa' dediğimizde gösterge döner. require'ın da aynı tür döndürmesi daha kullanışlı olurmuş.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2019

Hakikaten şöyle yapınca oluverdi:


import std.stdio;
import std.algorithm;
import std.string;

struct C{
   int[string] temp;
}

void foo( C* inC )
{
   int[string] temp = inC.temp;
   temp["erdem"] = 5; // Artık buda çalışıyor
   //inC.temp["erdem"] = 5; // Bu çalışıyor
}

void main()
{

   C c;
   c.temp["Ali"] = 10; // Bu yeni
   foo(&c);
   writeln(c);
}

Çok acayip işler ...

Bugünde bir şeyler öğrenmiş oldum çok teşekkür ederim Ali Abi.

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2019

Yerel referansa hem Walter hem Andrei başından beri karşılar çünkü referans, sonlanmış değişkeni gösteriyor olabiliyor. Çok kullanılan kütüphanelerde bile bunun neden olduğu hatalarla karşılaşılıyor. Bu hatalar çoğunlukla başka dillerde görülüyor ama D'de de olabiliyor. Zaten 'return' parametreler[1], DIP 1000[2] (terkedildi), vs. hep bu konuyla ilgili çözüm arayışları...

Gösterdiğin temp örneği, D'nin dizilerinde ve eşleme tablolarında şaşırtıcı olabilen bir konudur. Henüz eleman eklenmemiş, yani null olan diziler ve eşleme tabloları paylaşılamaz. inC.temp null olduğundan, foo içindeki temp ile ilgisi yok. Şaşırtıcı olan, null olmasa paylaşılmış oluyor. Bunun nedeni, kod etkinliğidir çünkü henüz içlerine eleman eklenmemiş diziler ve eşleme tabloları için gereksizce bellek ayrılmamalıdır. (Paylaşılabilmeleri için aynı yeri göstermeleri gerekir.)

Bu konu şu makalede "Belirsizlik" başlığı altında dilimler için anlatılıyor:

http://ddili.org/makale/d_dilimleri.html

Ali

[1] http://ddili.org/ders/d/islev_parametreleri.html#ix_islev_parametreleri.return,%20parametre
[2] https://github.com/dlang/DIPs/tree/master/DIPs

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]