Thread overview
Çoklu dosyalarla çalışma
Oct 26, 2017
cos00kun
Feb 16, 2020
cos00kun
Feb 18, 2020
cos00kun
Feb 22, 2020
cos00kun
October 27, 2017

bir proje açtım ve iki adet d dosyası yarattım ;

kutuphane.d

module kutup;
import std.stdio;
int degisken=20;
void foo() {
	writeln("Yeni Dosyadan Çalıştım");
	degisken=55;
	writeln("Yeni Dosyadan değişken= ",degisken);
}

AnaPencere.d

import std.stdio;
import kutup;
void main()
{
   writeln("Değişkeni diğer dosyadan okuyorum..",degisken);
	foo();
	readln();
}

void foo() {
   writeln("Ana Dosyadan okuyorum");
}

Şimdi her iki dosyada da tanımlı olan foo() fonksiyonunu (pardon artık işlevi :) ) D derleyicisi nasıl yorumlar ? yani önce kutuphane.d de tanımlı foo() yu öncelikle Anapencere.d de import edeceğinden aslında neden öncelikli olarak kutuphane.d deki foo() çalışmıyo da AnaPencere.d deki foo() çalışıyor ?

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

October 27, 2017

Uzun isimleri farklıdır: AnaPencere.foo ve kutup.foo

AnaPencere'da yalnızca foo() yazınca kendi foo'su anlaşılır. Hangisini istediğini açıkça belirleyebilirsin:

   kutup.foo();
   AnaPencere.foo();
   foo();    // Üstteki satırın aynısı
   .foo();   // Bu da üstteki satırın aynısı

Son satırın anlamı: "bu modül düzeyinde tanımlanmış olan foo".

Ali

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

February 16, 2020

Alıntı (cos00kun:1509089383):

>

bir proje açtım ve iki adet d dosyası yarattım ;

dosya.d

> module dosya;
> import std.stdio;
> int degisken=20;
> void foo() {
> 	writeln("Yeni Dosyadan Çalıştım");
> 	degisken=55;
> 	writeln("Yeni Dosyadan değişken= ",degisken);
> }
> ```

>
> ****main.d****
>

import std.stdio;
import dosya;
void main()
{
writeln("Değişkeni diğer dosyadan okuyorum..",degisken);
foo();
dosya.foo();
readln();
}

void foo() {
writeln("Ana Dosyadan okuyorum");
}

>

.....
.....

konu başlığındaki dosyaların isimlerini ve nodül isimlerini değiştirerek bir makefile dosyası yaptım..

derle: main dosya
	dmd -m64 main.obj dosya.obj program.exe

dosya:
	dmd -c -m64 dosya.d dosya.obj

main:
	dmd -c -m64 main.d main.obj

*.obj dosyalarım oluşuyor ancak program.exe dosyam oluşmuyor.. ancak; terminalde "dmd -m64 main.obj dosya.obj program.exe" yazdığımız zaman makefile dosyasından çalışmayan bu kod program.exe dosyasını oluşturuyor.. Acep ne olaki? :nuts:

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

February 17, 2020

Çıkış dosyasının adını '-of' seçeneği ile vermek gerek.

Orta ve küçük boy D programları için en iyisi, tek make hedefi belirlemek:
'
KAYNAKLAR=
foo.d
bar.d \

program: $(KAYNAKLAR) Makefile
dmd $(KAYNAKLAR) -of=$@
'
Kafadan yazdım ama o kadarı yeterli olmalı (dmd'den önce TAB karakteri var; boşluklar değil). Genelde SECENEKLER filan gibi bir değişken de kullanılır.

Senin Makefile'da düzeltecek şeyler var:

  • dosya: ve main: hedefleri, o isimlerde dosya oluşturulmasını sağlamak içindir. Yani, make, o komutları işlettiğinde 'dosya' ve 'main' isimli dosya oluşacağını sanacaktır. Oysa senin komutların o isimlerle ilgisi yok.

  • Dahası, klasörde tesadüfen 'dosya' ve 'main' isimli dosyalar olsa, make o komutları hiç işletmeyecektir; çünkü 'dosya' ve 'main' zaten var ve hiçbir başka dosyaya bağımlı değiller. Bu sorunun çözümü, .PHONY sözde hedefini kullanmaktır. Aynı sorun 'derle'de var.

Aşağıdaki 4 dosya söylediklerimin kısa bir örneği:

// main.d

module main;

import std.stdio;
import bar;

void main() {
 writeln(hesap(1));
}
// bar.d

module bar;

import foo;

int hesap(int i) {
 return ikiKatı(ikiKatı(i));
}
// foo.d

module foo;

int ikiKatı(int i) {
 return i * 2;
}

'

Makefile

KAYNAKLAR=
bar.d
foo.d
main.d \

SECENEKLER=
-O
-w
-de \

program: $(KAYNAKLAR) Makefile
dmd $(KAYNAKLAR) $(SECENEKLER) -of=$@
'
Ali

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

February 17, 2020

Öte yandan, bütün programı tek komutta üretmeyi gerçekten istemiyorsak şöyle bir Makefile kullanabiliriz:
'

Makefile

KAYNAKLAR=
bar.d
foo.d
main.d \

Ara adimlarimiz bu dosyalar olacak:

(Burada bar.o, foo.o, ve main.o anlamina gelir.)

PROGRAM_PARCALARI= $(KAYNAKLAR:%.d=%.o)

SECENEKLER=
-O
-w
-de \

Bu, .d'den .o olusturma kurali

%.o: %.d Makefile
dmd -c $< $(SECENEKLER) -of=$@

Bu, butun .o'lardan 'program'i olusturma kurali.

program: $(PROGRAM_PARCALARI)
dmd $(PROGRAM_PARCALARI) $(SECENEKLER) -of=$@

'clean' hedefi, olusturulan butun dosyalari silecek.

Bunun daha dogrusu, yukaridaki hedefleri 'build' isimli

bir klasor icinde olusturmak ve burada 'build' klasorunu

tek adimda kaldirmaktir.

clean:
rm -f program $(PROGRAM_PARCALARI)
'
Bunun yarari, programı yalnızca bir .o değiştiğinde oluşturmasıdır. Her .o'yu da yalnızca kendi .d'si değiştiğinde oluşturur. Ama dmd çok hızlı derlediğinden ben gerekmedikçe bütün dosyaları tümden verip programı her seferinde baştan oluşturmakta bir sakınca görmüyorum. :)

Ali

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

February 18, 2020

teşekkürler.
Ama yine de Geniş kapsamlı bir GNU make veya Json makalesi hazırlamanın gerekli olduğuna inanıyorum D Forumumuz için. Bu kodları denedikten sonra tekrar yazacağım Ali hocam.. sağol varol :blush:

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

February 23, 2020

Ali hocam selamlar..
şimdi Make ile çalışırken bağımlılıkların dosya olma zorunluluğu var anladığım kadarıyla. Kaynak, değiştirilme durumuna göre bağımlılıkları kontrol ediyor ve bu bağımlılık dosyaları değiştirilmişse bu bağımlılıkları yeniden işleme koyuyor ve altındaki komutları çalıştırıyor. Temel mantık bu sanırım. Ayrıca Make, şöyle bir yönteme başvuruyor bu bağımlılıklar dosya ismi olduğu gibi yine bu dosya ismini alt bölümlerde Kaynak gibi tanımlayarak o dosyalara da bağımlı bir kaynak yaratılabiliniyor..
ya baştan aşağıya yanlış anlıyorum yada hedefi kenarındam vurdum. :-D

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

February 23, 2020

Doğru anlıyorsun.

Ali

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