Forum: D Programlama Dili RSS
main() işlevindeki parametrelerinin kullanım alanları
cos00kun #1
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: main() işlevindeki parametrelerinin kullanım alanları
Ş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);
......
.....
E=mc^2
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 1076 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 168 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
cos00kun #4
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
E=mc^2
cos00kun #5
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
E=mc^2
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 1076 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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);
}
$ ./test --kütük deneme.txt --uzunluk 11 --renk evet
uzunluk: 11
kütük: deneme.txt
ayrıntılı: false
renk: evet
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4643 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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


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
cos00kun #8
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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..
E=mc^2
Bu mesaj cos00kun tarafından değiştirildi; zaman: 2018-01-17, 23:40.
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:
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: 2018-02-23, 12:25:56 (UTC -08:00)