Thread overview
Struct Degerlerini Resetleme
Jul 16, 2017
kerdemdemir
Jul 16, 2017
kerdemdemir
Jul 17, 2017
kerdemdemir
July 16, 2017

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

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

July 17, 2017

Abi birde .initializer gibi bir sey var. Bu kullanici turleri icinde gecerlimidir.

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

July 16, 2017

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

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

July 17, 2017

Ç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 ?

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

July 17, 2017

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

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

July 17, 2017

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

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