Thread overview
Vibe.d async fonksiyonunda referans dizi parametreleri
Nov 30, 2019
kerdemdemir
Nov 30, 2019
kerdemdemir
November 30, 2019

Sorunum basitce şu :

import std.stdio;
import vibe.core.core;
import vibe.core.concurrency;
import vibe.data.json;

void main()
{
int[] list;

bool ListManipulator(ref int[] list)
{
list ~= 2;
list ~= 4;
return true;
}

bool ListManipulatorPointer( int[]* list)
{
*list ~= 2;
*list ~= 4;
return true;
}

auto future = vibe.core.concurrency.async(&ListManipulator, list);
future.getResult();

writeln(list); ----> prints empty list

future = vibe.core.concurrency.async(&ListManipulatorPointer, &list);
future.getResult();

writeln(list); ----> prints [2,4]
}

Neden referans yerine gösterge geçtiğimde liste doldurulmaya başlıyor? Bu örnekten ne öğrenebilirim acaba ?

Erdem

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

November 30, 2019

İngilizce forumda da sormuştum ordaki arkadaşlardan biri bunun bir vibe-d içinde bir sorun olduğunu belirtti.

Şimdi vibe.d'ye bir bug oluşturacağım github'da.

Erdemdem

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

November 30, 2019

DÜZELTME: 'ref'i görmediğimi farkettim. Aşağıda yazdıklarım bu durumda anlamsız. :/

Ben vibe.d kullanmıyorum ama bu D'nin tuzaklarından birisi:

void doldur(int[] liste) {
 liste ~= 42;
}

void main() {
 int[] liste;
 doldur(liste);
 assert(liste is null);    // Değişmedi!
}

Dilimler ve eşleme tabloları null olduklarında henüz kopyalarıyla paylaştıkları bellekleri yoktur. İşlevin içinde şöyle bir mantık yürütüldüğünü düşünebiliriz: "if (liste.ptr is null) { liste.ptr = bellekAyır(); }". main'deki liste'nin bu durumdan haberi olamaz.

Tabii, gösterge yerine ref de geçirilebilir. Bir başka çözüm, listeyi döndürmek ve çağıran tarafta tekrar atamaktır:

 liste = doldur(liste);

Bu gibi ayrıntılar şurada anlatılır:

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

Orada İngilizce'sine bağlantı da var.

Ali

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