March 20, 2010

Alıntı (canalpay):

>

Artık en çok istediğim ders göstergeler oldu.

Bundan sonraki ders o olacak.

Alıntı:

>

Her ne kadar D'de göstergelerin eski önemi kalmasada, göstergeye destek tamamen kalkmadan göstergenin önemi kalkmayacak.

D'nin (ve başka dillerin de) avantajı, yeni başlayanların hiç gösterge kavramına bulaşmadan programlar yazabilmesi... Bir kere referans kavramını gösterge olmadan öğrenince, umarım göstergeler zaten anlaşılmış olacak.

C'de ise göstergeyi anlamadan ciddi program yazılamaz.

Alıntı:

>

Ama tekrar tekrar okuyacağım sindirebilmek için.

Bu tür konulara daha fazla ihtiyacımız var. Kimse ders metni okuyarak öğrenemez. :) Böyle forumlar çok daha önemli. Onun için bol bol sor. :)

Alıntı:

>

void[] ve void (belki de void) ne işe yarar ?

zaten void değer dönmeyecek anlamı taşımıyor mu ? Onun nasıl bir dizisi olur ?

void, tek başına olduğunca yalnızca dönüş türü olarak kullanılabilir. (Umarım başka bir istisnayı unutmuyorumdur.) Öyle olduğunda, senin de dediğin gibi, "hiçbir tür döndürmez" anlamına gelir.

void* ise, bambaşka bir anlama gelir: "herhangi bir türü gösterebilir" demektir. Bu türden olan bir değişken, herhangi türden bir değişkeni gösterebilir.

void*, C'de şarttır. Türden bağımsız algoritmalar yazarken gerekir. Örnek olarak: qsort. void*, nesneye yönelik dillerde o kadar önemli değildir; çünkü onlarda arayüzler (interface) kullanılabilir. Yani "herhangi bir tür" kadar genel bir ifade yerine, "herhangi bir hayvan" demek daha güvenli ve daha kullanışlıdır.

void*, herhangi bir türü gösterse de, daha sonradan asıl tür olarak kullanılırken, yine de mutlaka, asıl türe dönüştürülmek zorundadır. O yüzden, asıl türün ne olduğunu bir şekilde bilebilmemiz gerekir. Bazen bir enum değeri işe yarayabilir.

Aşağıdaki çok saçma bir örnek ama bir fikir verebilir. Derleyici void* türü konusunda fazla yardım getiremez. Herhangi bir türü göstermek istediğimizi bildiği için tür denetimi sağlayamaz. main'in içinde string türüyle ilgili bir hata var ama derleyici bunu göremez.

import std.stdio;

enum Tür
{
   tamsayı, kesirli
}

void main()
{
   void * gösterge;

   int i;
   gösterge = &i;
   kullan(gösterge, Tür.tamsayı);
   writeln(i);

   double d;
   gösterge = &d;
   kullan(gösterge, Tür.kesirli);
   writeln(d);

   // HATALI kullanım: string türüne karşılık Tür.tamsayı denmiş...
   string s;
   gösterge = &s;
   kullan(gösterge, Tür.tamsayı);
   writeln(s);
}

void kullan(void * veri, Tür tür)
{
   final switch(tür){
   case Tür.tamsayı:
       tamsayı_gibi_kullan(veri);
       break;

   case Tür.kesirli:
       kesirli_gibi_kullan(veri);
       break;
   }
}

void tamsayı_gibi_kullan(void * veri)
{
   int * asıl_tür_göstergesi = cast(int*)veri;
   *asıl_tür_göstergesi = 42;
}

void kesirli_gibi_kullan(void * veri)
{
   double * asıl_tür_göstergesi = cast(double*)veri;
   *asıl_tür_göstergesi = 1.25;
}

Ali

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

1 2
Next ›   Last »