Forum: Ders Arası RSS
D geliştiricileri için bir kaç husus/soru
Sanırım daha çok soru...:)
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ı: D geliştiricileri için bir kaç husus/soru
Merhaba,

Bir süredir; D üzerine program geliştiriyorum. Bir kaç küçük soru biriktirdim. Bu belki genel programlama ile de alakalı olabilir. Ancak kesinlikle cevaplarını D çerçevesinde beklemekteyim!

(ukala sincap seni...:D)

Göz korkutmamak için adım adım gitmek istiyorum. Örneğin özelleştirilmiş kütüphanelerden bahsedelim. Yılbaşından beri kendi kütüphanemi toplamaya çalışıyorum. Kütüphane dediğime bakmayın, sağda solda parça halindeki küçük kodları, bir düzen halinde sdb.xyz sınıfı olarak toparlıyorum. İlk işim algorithm ve math gibi şeyler. Ancak büyük bir sıkıntım var:

public import olayını biliyorum ama her seferinde kodumu derlerken tüm kullanılan modülleri, bulunduğu yeri, derleme parametresi olarak vermem gerekiyor! Bunun önüne geçmenin bir yolu var mı? Örneğin sdb kütüphanesini phobos'a ait olmadığı halde içine mi yerleştirsem? Çünkü derleyici ilk oraya (src, phobos dizinleri) baktığını biliyorum...

Yoksa derleyicinin bir configuration dosyası var mı?

Şimdilik bu kadar, teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2013-02-09, 05:10.
Değişiklik nedeni: Önemsiz, anlamı bozmayan yazım hatalarını düzelttim...
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ı
Var: dmd.conf

Eğer dmd sisteme kurulmuşsa örneğin /etc klasörüne kopyalanıyor. Eğer zip dosyasından açılmışsa açıldığı yerde duruyor.

Kurulan dmd /etc'dekini kullanıyor, açılan dmd kendisi ile ilişkili olanı kullanıyor. En azından öyle olması gerekiyor ama bu konuda karışıklık yaşayan programcılar oluyor. Farkında olmadan sistemdeki başka bir dmd.conf'u kullanıyorlar.

  http://dlang.org/dmd-linux.html#dmd_conf

O dosyadaki satıra herhalde -I seçeneğini eklemen gerekecek.

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ı
Çok teşekkürler Ali hocam ama beceremedim galiba...:)

Bende ki /etc/dmd.conf dosyasının içeriği şöyle:
;
; dmd.conf file for dmd
;
; dmd will look for dmd.conf in the following sequence of directories:
;   - current working directory
;   - directory specified by the HOME environment variable
;   - directory dmd resides in
;   - /etc directory
;
; Names enclosed by %% are searched for in the existing environment and inserted
;
; The special name %@P% is replaced with the path to this file
;

[Environment]

DFLAGS=-I/usr/include/d/dmd/phobos -I/usr/include/d/dmd/druntime/import -L-L/usr/lib64 -L-L/usr/lib -L--no-warn-search-mismatch -L--export-dynamic


Buradaki DFLAGS= eşitliğinden sonra, şu yolu bayrağı ile bitişik şekilde ekledim:

-I/home/atelyeweb/Projeler

İçinde sdb dizini ve sınıflarım var ama derleme esnasında yine şu hataları alıyorum:

tabanAritmetik.o: In function `_D14tabanAritmetik6Dünya6__ctorMFZC14tabanAritmetik6Dünya':
tabanAritmetik.d:(.text._D14tabanAritmetik6Dünya6__ctorMFZC14tabanAritmetik6Dünya+0x28): undefined reference to `_D3sdb9algorithm9Base32v656__ctorMFAyaZS3sdb9algorithm9Base32v65'
tabanAritmetik.o: In function `_D14tabanAritmetik4Atom2idMFNdZAya':
tabanAritmetik.d:(.text._D14tabanAritmetik4Atom2idMFNdZAya+0x45): undefined reference to `_D3sdb9algorithm9Base32v656encodeMFNdmZAya'
tabanAritmetik.o: In function `_Dmain':
tabanAritmetik.d:(.text._Dmain+0x46): undefined reference to `_D3sdb9algorithm9Base32v656__ctorMFAyaZS3sdb9algorithm9Base32v65'
tabanAritmetik.d:(.text._Dmain+0x5d): undefined reference to `_D3sdb9algorithm9Base32v656encodeMFNdmZAya'
tabanAritmetik.d:(.text._Dmain+0x8d): undefined reference to `_D3sdb9algorithm9Base32v656decodeMFNdAyaZm'
collect2: hata: ld çıkış durumu 1 ile döndü
--- errorlevel 1

Hatta -I parametresini (L değil büyük I harfi) yol ile birlikte elle de girmeyi denedim, belki sistem boot olduğunda bu bilgiler hafızaya yükleniyor olabilir dedim ama değişen bir şey olmadı...:(
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
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ı
-I, import edilen modüllerin nerede olduklarını bildiriyor. O modüller yine de ayrıca derlenmeleri ve programa bağlanmaları gerek. En kolayı, bütün ilgili modülleri aynı satıra yazmak:

dmd deneme.d kullandigim_modul.d ...

İstersen o modülleri kütüphane haline getirdikten sonra da bağlayabilirsin:

  http://ddili.org/ders/d/moduller.html

Ali
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Benim, bir de en çok kafamı karıştıran soru en sık kullandıklarımdan:

alias this ile ilgili...

Sanırım yakında, eşittir (=) işareti ile birlikte kullanmak gerekecek? Peki tam olarak değişen kısaca nedir? Yani this eskiden sondaydı şimdi ortada mı?

Şöyle bir rakamları sayan yapımız olsun:
struct Rakamlar {
  int rakam;
 
  alias front this/* <-- DMD 2.6x'den öncesi
  alias this = front; //*     için satırı açın */
  
  int front() const  {      return rakam;      }
  void popFront()    {      rakam++;           }
 
  int back() const   {      return rakam - 1}
  void popBack()     {      rakam--;           }
 
  bool empty() const {
    return (std.math.abs(rakam) == 10);
  }
}
Biz bunu, eskiden gizlenen satırdaki gibi kullanıyorduk öyle değil mi? Peki sınıfı kullanırken değişen bir şey var mı? Örneğin ekrana yazdırdığımızı ve son elemanın değerini öğrendiğimiz farz edelim:
import std.stdio;
 
void main() {
   auto pozitifRakamlar = Rakamlar(1);
 
   assert (pozitifRakamlar == 1);
   foreach(rakam; pozitifRakamlar) rakam.write(",");
 
   putchar(8);   // bitecekse imleçi sola kaydır...
   writeln(" "); // sondaki virgülü silip satır başı yapar!
}/*
1,2,3,4,5,6,7,8,9
*/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
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ı
Hem alias'ın hem de alias this'in söz dizimleri daha doğal hale getirildi. İşlevinde hiçbir değişiklik olmadı.

Bu, alias'ın C'deki eşdeğeri olan typedef'in de çok eleştirildiği bir konudur. Doğal olan, tanımlanan şeyin isminin önce gelmesidir ama typedef'de tersidir:
typedef int Sicaklik;
(Tabii onu savunanlar da değişken tanımlamaya benzediğini söylerler: Asıl tür solda, tanımlanan şey sağda...)

D'ciler eleştirileri kabul ettiler ve şöyle değiştirdiler:
alias Sıcaklık = int;    // Artık Sıcaklık int'in eşdeğeri
alias this = birÜye;     // Bu nesne artık birÜye()'nin türünün yerine kulllanılabilir 

Verdiğin örnekteki kullanımın anlamı şu: front()'un türü ne ise (tabii int olduğu açık), bir Rakamlar nesnesi o türün yerine kullanılmak istendiğinde otomatik olarak front()'u çağır ve onun döndürdüğü sonucu kullan. Bu da otomatik tür dönüşümünden başka bir şey değil: Rakamlar nesnesi otomatik olarak int türüne dönüştürülüyor.

Ayrıca, bu aralık ilginç olmuş. front()'unun değeri 3 iken back()'inin değeri 2. Yani, baştan sona doğru ilerleme kavramı için garip.

Tabii bunu yalnızca denemek için yapıyorsun ama bütün aralığın tek elemanı yerine kullanılabilmesinin sorunları olacaktır. Bunu senin son üç satırını teke indirmeye çalışırken kendim yaşadım: writefln, pozitifRakamlar'ın bir int aralığı mı yoksa tek int mi olduğunu bilemiyor:
   writefln("%(%s,%)", pozitifRakamlar);
Yoksa, yukarıdaki satır da seninkiyle aynı çıktıyı üretecektir.

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:
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-18, 09:43:16 (UTC -08:00)