Thread overview
Sınıfların veya Yapıların harici üyeler edinmesi...
Aug 17, 2012
Salih Dinçer
Aug 17, 2012
Salih Dinçer
Aug 17, 2012
Salih Dinçer
Aug 18, 2012
Salih Dinçer
August 17, 2012

Merhaba,

Son bir kaç gündür C işaretçilerine yoğunlaşınca D'deki olanaklarını araştırmaya başladım. Özellikle aşağıdaki gibi bir yapıya ihtiyaç duyuyordum çünkü MVC deseninde parçalara bölünmüş kodun iletişiminde gerekiyordu. Gerçi bir yapıyı (örneğin view'deki) başka bir yapı içine üye yaparak iletişimi sağlamıştım. Sanırım bu şekilde daha verimli bir hafıza kullanımı olacak:

import std.stdio;

class View {
 private:
   int* genişlik;
   int* yükseklik;

 public:
   this(int* g, int* y) {
     this.genişlik = g;
     this.yükseklik = y;
   }

   @property int width() {
     return *genişlik;
   }

   @property int height() {
     return *yükseklik;
   }
}

class Control : View {
 bool sol, sağ, yukarı, aşağı;

 this(int* g, int* y) {
   super(g, y);
 }
}
int main() {
 int sahneGenişliği = 640;
 int sahneYüksekliği = 320;

 with (new View(&sahneGenişliği, &sahneYüksekliği)) {
   width.write(" x ");
   height.writeln;
 }

 return 0;
}

Aslında biz burada tanımladığımız bir harici üye değil tabii ki. Sadece üyelerini (View Sınıfı) işaretçi olarak tanımlamış olduk. Gerçi SDL ile uğraşıyorken işaretçiler havada uçuşuyordu ama aşağıdaki C örneğini çözene kadar bunu kullanmak hiç aklıma gelmemişti...:)
Alıntı:

>
> #include <stdio.h>
>
> char nullVar = '\0';
>
> char* find(char c, char* p) {
>     while(*p != c) {
>        if(*p == '\0') return &nullVar;
>        ++p;
>     }
>     return p;
> }
>
> int main() {
>    char a[6];
>
>    sprintf(a, "C dili");
>    printf("%s\n", a);  // C dili
>
>    *find('d', a) = 'D';
>    printf("%s\n", a);  // C Dili
>
>    ++ *find('C', a);
>    printf("%s\n", a);  // D Dili
>
>    -- *find('C', a); // nullVar sayesinde hata yok...
>    printf("%s\n", a);  // D Dili
>
>    return 0;
> }
> ```

>
İşin ilginci bu örneği de D'de yapamıyorsunuz...:D

Belki eşdeğeri dilimler ile yapılabilirdi (ben denedim beceremedim!) ama işaretçileri bu şekilde kullanmak yasal olmayabilir. Yine de find() işlevi D'de de birebir çalıştığını söyeleyebilirim. Sadece dışarıya döndürdüğü adrese müdahale etmekte kısıtlamalarımız var.

Her ne olursa olsun D'yi seviyorum...

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

Alıntı (acehreli):

>

Son programının tam D karşılığı aşağıdaki gibi bir şey olur herhalde. (Bu arada, C programında bir hatan var: 6 karakterlik yere 7 karakter yazıyorsun):
Teşekkürler, demek işin sırrı .ptr kullanmaktaymış. Açıkçası ben ne dizi üzerinde dilim kaydırarak aramayı yapabildim (becerebilseydim string de arayabilirdik!), ne de işaretçileri kullanmayı...:)

Bu arada dediğin gibi 7 yaptığımda DMD 2.059'da şu hatayı alıyorum:
Alıntı:

>

object.Exception@src/rt/arraycat.d(31): lengths don't match for array copy

Anladığım kadarıyla "C dili" 6 karakterden oluştuğu için 7 elemanlı dizide sorun yapıyor. Hoş C'de 0 bile yapsan umrunda bile olmuyor...:)

D'yi seviyorum...

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

August 18, 2012

Bu arada işaretçi ile beceremeyince dilim ile yapmaya çalıştığım deneme şu şekilde ama araBul() işlevi doğru çalışıyor:

import std.stdio;

char[] araBul(string aranan, char[] kaynak) {
   size_t dizin;
   char[] dilim;

   while(dizin < kaynak.length-aranan.length) {
       dilim = kaynak[dizin..dizin+aranan.length];
       if(dilim == aranan) return dilim;
       ++dizin;
   }
   return kaynak[0..0];
}

int main() {
 char[] deneme = cast(char[])"C dili";
 deneme.writeln; // C dili

 auto birDilim = araBul("dil", deneme);
 birDilim.writeln;
 birDilim = cast(char[])"pir";

 deneme.writeln; // C Dili

 deneme.writeln; // D Dili

 return 0;
}

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

August 18, 2012

O bir denemeydi...
Bazen o sınırı 0, bazen 5 ve bazen ise 7 yapmıştım; C'nin duyarsızlığını ortaya çıkarabilmek için. Pis C...:)

Aslında ayrı bir başlık açmalıyım! Çünkü C'ye her ne kadar şaka yoluyla "pis" desem de bana çalışabilecek ikiden fazla konu verdi. İşte diğer konu ise yukarıda göstergeler ile yapabildiğimiz şeyi şurada (http://ddili.org/forum/thread/933) dilimler ile yapabilmemiz...

Dip Not: Meğer Ali hocamın yazdığı D uyarlamasının ilacı .ptr iken, bağlantısını verdiğim başlıktaki kodun ilacıysa .dup imiş...

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

August 17, 2012

C'de olup da D'de olmaması mümkün mü? D bir sistem dilidir denirken bizi kandırdıklarını düşünmüyoruz herhalde. :)

Ama C dilinde C'ce yazılır; D dilinde de D'ce. Amaca bakmak gerek. Örneğin, ilk örneğindeki gibi yalın göstergeler D'de hemen hemen hiç gerekmiyor.

Son programının tam D karşılığı aşağıdaki gibi bir şey olur herhalde. (Bu arada, C programında bir hatan var: 6 karakterlik yere 7 karakter yazıyorsun):

import std.stdio;

char nullVar = '\0';

char* find(char c, char* p) {
   while(*p != c) {
       if(*p == '\0') return &nullVar;
       ++p;
   }
   return p;
}

int main() {
   char[7] a = "C dili";
   writeln(a);  // C dili

   *find('d', a.ptr) = 'D';
   writeln(a);  // C Dili

   ++ *find('C', a.ptr);
   writeln(a);  // D Dili

   -- *find('C', a.ptr); // nullVar sayesinde hata yok...
   writeln(a);  // D Dili

   return 0;
}

Ali

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

August 18, 2012

Alıntı (Salih Dinçer):

>

Bu arada dediğin gibi 7 yaptığımda DMD 2.059'da şu hatayı alıyorum:

D başka C başka. Senin programın C dilindeydi. ;)

Ali

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