Thread overview
main() işlevindeki parametrelerinin kullanım alanları
Jan 16, 2018
cos00kun
Jan 16, 2018
erdem
Jan 16, 2018
kerdemdemir
Jan 16, 2018
cos00kun
Jan 16, 2018
cos00kun
Jan 17, 2018
erdem
Jan 17, 2018
cos00kun
January 16, 2018

Şimdi en basit D kodunda main() işlevindeki parametrelerin özel bir kullanımı varmıdır ne işe yararlar neden main () içinde tanımlanırlar bu parametrelere bilgi ne zaman hangi yoldan gelmektedir.? Aslında en merak ettiğim konuda bu parametrelere biz değer vermesekte bu değerler nasıl gelmektedirler ? biraz bilgi alabilirmiyim ?

import std.stdio;
void main(string[] parametreler)
{
   writeln("Merhaba, Dünya!");
}

Örneğin ali hocam şu örnekte http://ddili.org/forum/post/12949 args parametresini aşağıdaki satırlarda kullanmış..

       stderr.writefln("Kullanım: %s <dosya ismi>", args[0]);
       return 1;
   }

   Falcon4Entity[] entries = oku(args[1]);

Yine aynı şekilde GtkD kütüphanesinde ble en basitinden yine main() işlevindeki parametre kullanılıyor

.....
.....
int main (string[] args)
{
   Main.init(args);
.....
....

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

January 17, 2018

Gunluk hayatimizda kullandigimiz bir cok program ornegin

tar -cvf dest.tar source
ls -larth
cut -d '/' -c 3 (bunu kafamdan yazdim biraz)

bu argumanlari kullaniyor.

Ama bu argumanlari dogru almak gercekten zahmetli bir is mesela

ls -l -a -r -t -h

ile

ls -larth

ayni sey ve hatta

ls -l --all --reverse -t  --human-readable

'da ayni sey.

Dahada karmasiklasabilecek bu arguman isleri D'nin standart kutuphanesinde bulunan https://dlang.org/phobos/std_getopt.html
ile kolaylasiyor. Ornegin C++'da std'da boyle bir yardimci yok. Bu is icin genelde boost gibi kutuphaneler kullanilmak zorunda kaliniyor.

Erdemdem

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

January 17, 2018

Bunlar komut satırı programa gönderilen parametreler. Örneğin programı çalıştırırken:

program ilkparametre ikinciparametre ..

şeklinde programa komut satırı parametreler gönderebiliyoruz. Sonra args[0] ilk parametreyi gösteriyor.

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

January 17, 2018

hmm anladım gibi..
o halde şunu söyleyebilirmiyiz ? Program, komut satırındaki parametreleri main() işlevinde eğer tanımlanmışsa o parametreye atıyor ..

şimdi şöyle bir basit kod yazdım;

import std.stdio;
import std.string;

void main(string[] parametreler) {
	string sonuç="ACABA NE";
	writeln(sonuç~parametreler);
	readln();
}

ardından oluşan *.exe dosyasını (farzedeleim sil.exe) komut satırında, 'deneme YAZACAĞIM ' ile çalıştırdım. ve sonuç şu şekilde çıktı;

C:\Users\Coskun\source\repos\Deneme1\D Denemeleri\Win32\Debug>sil yazacagim
["ACABA NE", "sil", "YAZACAĞIM"]

Çok iyiymiş :-) burada sil neden çıktı anlayamadım ama bunları öğrenmekte iyi oldu açıkçası.. aslında birde direk olarak '["ACABA NE", "sil", "YAZACAĞIM"]' yerine '["ACABA NE YAZACAĞIM"] 'çıkaydı ballı ekmek kadayıfı olacaktı :-D

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

January 17, 2018

Bir başka soruda komut satırından string değilde direk sayısal değer okutup işlem yapabiliyormuyuz ? ben yukardaki programı string yerine int ile denedim ancak kullandığım IDE den string[] kullan diyerek main içinde int kullandığım için fırça yedim :-p

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

January 17, 2018

Evet dizge, tamsayı,ikili hatta enum kullanabiliyorsun.

Bunun için 'std.getopt' kullanıyoruz.

import std.stdio, std.getopt;

void main(string[] args)
{
   string dosya = "dosya.dat";
   int uzunluk = 24;
   bool ayrıntılı;
   enum Renk { evet, hayır}
   Renk renk;

   args.getopt("uzunluk",  &uzunluk,    // Tamsayı
               "kütük",    &dosya,      // Dizge
               "ayrıntılı", &ayrıntılı, // Boolean bayrağı
               "renk",   &renk);        // Enum.

   writeln("uzunluk: ", uzunluk);
   writeln("kütük: ", dosya);
   writeln("ayrıntılı: ", ayrıntılı);
   writeln("renk: ", renk);
}

Alıntı:

>

$ ./test --kütük deneme.txt --uzunluk 11 --renk evet
uzunluk: 11
kütük: deneme.txt
ayrıntılı: false
renk: evet

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

January 17, 2018

Sıfırıncı parametre, hep program çalıştırılırken yazılan adı gösterir: 'sil', 'programlarım/sil', veya başka bir şey. Bazı programlar bu parametreye bakarak davranışlarını değiştirirler. Örneğin, GNU'nun meşhur C ve C++ derleyicisi 'gcc' diye başlatıldığında C, 'g++' diye başlatıldığında C++ derleyicisi olarak çalışır. O iki isim aslında aynı programın farklı adıdır (symbolic link marifetiyle):
'
$ file /usr/bin/gcc
/usr/bin/gcc: symbolic link to gcc-5
$ file /usr/bin/g++
/usr/bin/g++: symbolic link to g++-5
'

Alıntı:

>

string değilde direk sayısal değer okutup işlem yapabiliyormuyuz

D gibi, türlerin derleme zamanında denetlendiği dillerde olanaksız. main'in parametresini string olarak yazdıysak stringdir. Burada çok önemli bir nokta var: Satıra "42" yazdığımızda bile onun aslında '4' ve '2' karakterlerinden oluşan bir string olduğunu anlamak gerek. O iki karakterin 42 değerine karşılık gelen bir tamsayı olduğuna ancak anlaşmalarla karar verebiliriz. Örneğin, yazılan 42 belki de onaltılı sayı sisteminde düşünülecektir ve 4 çarpı 16 artı 2 anlamındadır. Bizim yazdığımız main'i çağıran programın başlangıç düzeneğinin bu konuda karar vermesi olanaksızdır. Çünkü hatta belki de "42" gerçekten de string olarak kalması gereken bir isimdir.

Aslında Erdem'in gösterdiği getopt örneğinde de durum aynı. Güzel olan, getopt'a dolaylı olarak şu değişkenin değerine otomatik olarak dönüştür demiş oluyoruz.

Açıkça tür dönüştürmenin bir yolu, daha önce de karşılaştığımız ConvException hatasını atabilen std.conv.to'dan yararlanmaktır:

import std.stdio;
import std.conv;

int main(string[] args) {
   if (args.length != 2) {
       // Hata mesajlarını stderr'e yazdırmak âdettendir
       stderr.writeln("Kullanım: %s <adet>", args[0]);

       // Sıfırdan farklı değerler programın başarısızlıkla sonlandığını
       // belirtir
       return 1;
   }

   int adet;

   try {
       adet = to!int(args[1]);
   }
   // Burada özellikle ConvException hatasına da bakabilirdik ama o da aslında
   // bir Exception olduğundan hatayı böylece daha genel olarak da
   // kullanabiliriz.
   catch (Exception hata) {
       stderr.writeln("HATA: ", hata.msg);
       // Gerektiğinde ayırt edilebilsin diye bu çeşit hatayı farklı bir
       // değerle bildiriyoruz
       return 2;
   }

   foreach (i; 0 .. adet) {
       writeln(i);
       if (i == 10) {
           writeln("[...]\nBu kadar yeter herhalde... :)");
           break;
       }
   }

   // Herşey yolunda gitti
   return 0;
}

Ali

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

January 17, 2018

Tamamdır anladım tam olarak konuyu..
'int main(string[] args)' deyimindeki args aslında komut satırında yazılan tüm herşeyi (Bu programın ismide olsa) string dizgisi olarak alarak args[] dizisine sırayla atama yapıyor. Bazan ufacık ve basit şeyleri çözüm söylendikten sonra anladığında insan kendine kızıyor biraz ama yapacak birşey yok katlanacaksınız bana artık benden kurtuluş yok :-p

Konuyla pek alakalı değil ama D dilini her geçen gün dahada seviyorum.. Aslında bu dili eh işte yeni öğrenen biri olarak öğrenme zamanı sırasına göre düşüncelerim şu şekilde :-)

* D dili çok basit görünüyor
* D dili gerçekten basitmiş ilk programımı yaptım diğer dillerden çok daha kolay
* Alla Alla niye olmuyor..
* Bu ne.. Bu ne... Kaynak yok.. Ali hocam..? Erdem hocam.. ?
* Uff bi dolu nitelik ve özellik daha mı !
* Hocam teşekkürler.. Hocam sağolun varolun... (Uleyn ne kadarda basitmiş niye benim aklıma gelmedi bu söyledikleri :-D  )
* D ile herşey yapılabilir.
* Aaaa konuları öğrendikçe D basitleşmeye başladı yine

şimdilik bu kadar ilerledikçe tekrar eklemeler yapacağım topici bulabilirsem tabi :blush:

saygılar sevgiler herkese güleç ve huzur dolu bir gün dilerim..

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