Forum: D Programlama Dili RSS
Struct Degerlerini Resetleme
kerdemdemir #1
Üye Eyl 2013 tarihinden beri · 78 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Struct Degerlerini Resetleme
Selamlar,

Diyelimki şöyle bir struct ım var.

struct A 
{
    int a;
    int b;
    int c;
    int d;
    int e;
 
    void Resetle() // ->Herseye 0 atamak istiyorum ama a = 0; b = 0; yazmak istemiyorum
    {
        this = A(); // -> Sizce bu satırda sorun varmı. Derlendi ve çalışıyor ama ben yinede prensip olarak 
                        //  yapmamalımıyız diye sormak istedim 
    }
}

Yukarda belirttiğim gibi this = A() satırı tam istediğim şeyi yapıyor  ama bir sınıfın kendi methodunda kendi default ctor'unu çağırmak D de kullanılırmı veya  önerilirmi ?


Erdemdem
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4428 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bence doğru. Ancak, "sıfırlama" derken bazı türlerin ilk değerlerinin sıfır olmadığını hatırlamak gerek. (Kesirli türler .nan, char, wchar, ve dchar ise geçersiz Unicode kodlama değerleri.)

Ali
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 78 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Abi birde  .initializer gibi bir sey var. Bu kullanici turleri icinde gecerlimidir.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4428 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, TypeInfo.initializer her türün .init değerini bir bayt dizisi olarak döndürür. Ancak, bu .init değeri bütünüyle sıfır değerlerinden oluşuyorsa, bir dizi döndürmek yerine bu özel durumu özel biçimde tarif eder: TypeInfo.initializer.ptr null'dır ve TypeInfo.initializer.length kaç adet sıfır bulunduğunu bildirir.
import std.stdio;
 
struct S1 {
    double d;
    int i;
}
 
struct S2 {
    long l;
    int i;
}
 
void main(){
    bildir(typeid(S1));
    bildir(typeid(S2));
    bildir(typeid(int));
}
 
void bildir(TypeInfo ti) {
    auto i = ti.initializer;
    if (i.ptr is null) {
        writefln("%s.init %s adet sıfırdan oluşuyor.", ti, i.length);
    } else {
        writefln("%s.init şu baytlardan oluşuyor: %s", ti, i);
    }
}

deneme.S1.init şu baytlardan oluşuyor: [0, 0, 0, 0, 0, 0, 252, 127, 0, 0, 0, 0, 0, 0, 0, 0]
deneme.S2.init 16 adet sıfırdan oluşuyor.
int.init 4 adet sıfırdan oluşuyor.

Ali
kerdemdemir #5
Üye Eyl 2013 tarihinden beri · 78 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Çok ilginç bir şeymiş bu baya özelleştirilmiş özellikle sıfırlardan oluşduğunu filan farketmesi yani bildiğin Dark Magic. Bunlar derleme zamanında mı hesaplanıyor yoksa tamemem çalışma zamanı mı acaba ?
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4428 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hem derleme zamanında hem çalışma zamanında. object.d'nin (örneğin /usr/include/dmd/druntime/import/object.d) içine bakarsan her çeşit tür için farklı olduğunu görüyorsun: TypeInfo_Struct, TypeInfo_Class, TypeInfo_Enum, vs. O kadarı derleme zamanında belli... Ama örneğin TypeInfo_Class'ın vtbl ve create() gibi üyeleri var. Bunlar asıl nesne ile ilgili olan ve çalışma zamanında bilinebilen özellikler.

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-07-22, 09:47:42 (UTC -07:00)