Forum: Ders Arası RSS
Sınıfların veya Yapıların harici üyeler edinmesi...
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Sınıfların veya Yapıların harici üyeler edinmesi...
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...:)
#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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
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ı
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
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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:
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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;
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #5
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ı
Yanıtlanan mesaj #3
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
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 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ş...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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:
Forum: Ders Arası RSS
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-23, 23:16:11 (UTC -08:00)