Forum: D Programlama Dili RSS
Parametrelerde 'return' anahtar sözcüğü
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Parametrelerde 'return' anahtar sözcüğü
Referans parametrelerini döndüren işlevler tanımsız davranışa neden olabilirler. Aşağıdaki işlev parametrelerinden küçük olanına referans döndürüyor. O sayede dönüş değerine atayabiliyoruz.
/*
 * min()'in Türkçesi
 *
 * Notlar:
 *
 * 1) Bunun şablon olması çok daha uygundur
 *
 * 2) Normalde tek satır olarak yazılır:
 *
 *    return sağdaki < soldaki ? sağdaki : soldaki;
 */
ref int küçüğü(ref int soldaki, ref int sağdaki)
{
    if (sağdaki < soldaki) {
        return sağdaki;
 
    } else {
        return soldaki;
    }
}
 
unittest
{
    int i = 10;
    int j = 20;
 
    küçüğü(i, j) = 42;    // <-- Dönüş değerine atama
 
    assert(i == 42);
    assert(j == 20);
}
 
void main()
{}
Yani, ref döndürebilmek güzel. Ancak, parametrenin ömrü döndürülen ref'ten daha kısaysa tanımsız davranışla karşı karşıyayız demektir. D'de şimdilik aşağıdaki hatayı giderecek olanaklar bulunmuyor:
import std.stdio;
 
ref int foo(ref int i)
{
    // Örnek kısa olsun diye hemen döndürüyoruz
    return i;
}
 
ref int bar(int i)
{
    return foo(i);    // <-- HATA: bar'in parametresi kısa ömürlüdür
}
 
void main()
{
    int i = 42;
    int * p = &(bar(i));    // p, sonlanmış bir parametre değerini göstermektedir
 
    writeln("merhaba dünya");    // İlgisiz bir çağrı
    writeln(*p);                 // Bakalım elimizde ne var?
}
Tanımsız değer, karşımıza çöp değer olarak çıkabilir:

merhaba dünya
4389664          <-- Bu ne? :)

Kısa ömürlü değişkenlerin onlardan daha uzun ömürlü referanslar tarafından gösterilmelerini önlemek için derleyicinin bizden yardım alması gerekiyor. 2.067'de 'return' anahtar sözcüğü "bu parametre referans olarak döndürülebilir" anlamında kullanılabilecek:
ref int foo(return ref int i)    // <-- 'return' parametre
{
    // ...
}
 
ref int bar(return int i)    // <-- 'return' parametre
{
    // ...
}
Konunun ayrıntısı şurada:

  http://wiki.dlang.org/DIP25

Ali
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu çözüm şu konuya da merhem olabilir mi?

http://ddili.org/forum/thread/1420

En azından sorunun kaynağı ilişkili :)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Haklısın, konunun kaynağı aynı. Farkları, burada referans döndürülüyor, diğerinde ise referans elde tutuluyor.

Bu konunun tartışmalarını tam incelemedim ama herhalde senin gibi düşünenler olmuştur. (?)

Bu arada, bu olanak gerçekleştirildi bile: git head dmd'de mevcut.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 05:08:43 (UTC -08:00)