Forum: D Programlama Dili RSS
Dizideki elemanları parametre olarak gönderme
Sayfa:  1  2  sonraki 
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Dizideki elemanları parametre olarak gönderme
Merhaba yine ben :)

string str = "Adım: %s\nSoyadım: %s";
string[] strl;
strl ~= "Zekeriya";
strl ~= "Durmuş"

string val = std.string.format(str, strl);

şeklinde string.format fonksiyonunu denedim ama olmadı. elimdeki string dizisini std.string.format fonksiyonuna nasıl parametre olarak gönderebilirim.

Şu anki haliyle strl sadece tek bir %s yi karşılıyor. Bu nasıl çözülebilir veya alternatif çözüm yolları neler var?

Teşekkürler.
Bilgi meraktan gelir...
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ı
Tam olarak nerede gerekiyor? Acaba başka biçimde mi düşünmek gerek? Düzen dizgisini üreten tarafla parametreleri üreten tarafın birbirlerinden haberi yok mu? (Olmasa format() hata verir aslında.)

Ali
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Programlama diline d dilindeki format fonksiyonunu dahil etmek istiyorum ve Bir variant dizisi içerisinde parametreler geliyor. Parametre verilerini stringe çevriyorum ve bir diziye atıyorum ama diziye attığım için std.string.format fonksiyonuna dizi olarak gönderiyorum mecburen ve bu yüzden dizi sadece tek 1 %s ye tekabül ediyor.

Zekeriya
Bilgi meraktan gelir...
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ı
std.format'ın belgesinden ve birim testlerinden öğrendim. :)
import std.array;
import std.stdio;
import std.format;
 
void main()
{
    auto düzen = FormatSpec!char("Adım: %s\nSoyadım: %s");
 
    string[] strl;
    strl ~= "Zekeriya";
    strl ~= "Durmuş";
 
    auto yazıcı = appender!string;
 
    foreach (değer; strl) {
        düzen.writeUpToNextSpec(yazıcı);
        formatValue(yazıcı, değer, düzen);
    }
 
    writeln(yazıcı.data);
}
Ali
Bu mesaj acehreli tarafından değiştirildi; zaman: 2012-12-25, 16:32.
Avatar
zekeriyadurmus #5
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Çok teşekür ederim Ali hocam çalıştı.

Kolay gelsin :)

Zekeriya.
Bilgi meraktan gelir...
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ı
Bir eksiklik farkettim: Düzen dizgisinin en sonunda karakterler varsa yazdırılmıyorlar. (Örneğin, aşağıdaki "Merhaba".) Onun için en sonda bir tane daha writeUpToNextSpec() olması gerekiyor:
    auto düzen = FormatSpec!char("Adım: %s\nSoyadım: %s\nMerhaba");
    // ...
    // Döngüden sonra bir kere daha:
    düzen.writeUpToNextSpec(yazıcı);
Ali
Avatar
zekeriyadurmus #7
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet fark ettim onu ama o kadar da önemli değil açıkcası :)

Tekrardan teşekkür ederim Ali bey.

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #8
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanlız yanlış anlamışım sizi :) fark ettiğim şey şuydu.

"merhaba %s. saat %s %s" olsun sadece 1 tane değer gönderirseniz ilk %s den sonrası gözükmüyor.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #9
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ı
writeUpToNextSpec bir sonraki düzen belirtecine kadar ilerliyor. Öyle bir belirteç bulursa true, bulamazsa false döndürüyor. O değere iki yerde bakarak düzen dizgisinin doğru olup olmadığı anlaşılabilir:
import std.exception;
import std.string;
// ...
    foreach (i, değer; strl) {
        bool belirteçVar_mı = düzen.writeUpToNextSpec(yazıcı);
        enforce(belirteçVar_mı,
                format("Şu değer(ler) için belirteç bulunamadı:", strl[i..$]));
        formatValue(yazıcı, değer, düzen);
    }
// ...
    bool başkaBelirteçVar_mı = düzen.writeUpToNextSpec(yazıcı);
    enforce(!başkaBelirteçVar_mı, "Fazladan düzen belirteci bulundu");
Ali
Avatar
zekeriyadurmus #10
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sisteme uyguladım sorunsuz çalıştı.

Çok teşekkür ederim.

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
acehreli on 2012-12-25, 16:31:
std.format'ın belgesinden ve birim testlerinden öğrendim. :)
import std.array;
import std.stdio;
import std.format;
 
void main()
{
    auto düzen = FormatSpec!char("Adım: %s\nSoyadım: %s");
 
    string[] strl;
    strl ~= "Zekeriya";
    strl ~= "Durmuş";
 
    auto yazıcı = appender!string;
 
    foreach (değer; strl) {
        düzen.writeUpToNextSpec(yazıcı);
        formatValue(yazıcı, değer, düzen);
    }
 
    writeln(yazıcı.data);
}
Ali
Hocam bu std.format olanağı bana çok ilginç geldi. Tıpkı kendi gruplama düzen belirteçlerimizi beliryebilmemiz gibi. Peki aşağıdaki olanağın bir benzerini, çağrışımsal diziler için de yapabilmek mümkün mü?

Ben beceremedim de...:(
import std.stdio;
struct Foo {
  enum string[ubyte] data = [ 1: "bir", 2: "iki", 3: "üç" ];
 
  string toString() @property {
    auto outText = appender!string;
    foreach(keys; data.keys) {
      formattedWrite(outText, "%s: %s\n", keys, data[keys]);
    }
    return outText.data;
  }
}
void main() {
  Foo bar;
  bar.writeln;
}/*
1: bir
2: iki
3: üç
*/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #12
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ı
Salih Dinçer:
Peki aşağıdaki olanağın bir benzerini, çağrışımsal diziler için de yapabilmek mümkün mü?

Bu soruyu anlamam çok zor oldu. Programın sonuna koyduğun açıklama satırlarını programın çıktısı sanmıştım. Değilmiş; senin istediğin çıktıymış. Oysa program segmentation fault ile sonlanıyormuş.

Eşleme tablolarıyla ilgili bir sıkıntı yüzünden öyle oluyor: hazır değerleri (literal) sorunlu. Çözüm, 'static immutable' olarak tanımlamak ve türün 'static this()'i içinde ilklemek: (Türlerin 'static this'leri olabildiğini bilmiyordum; öğrenmiş oldum. :))
import std.array;
import std.stdio;
import std.format;
 
struct Foo {
    static immutable string[ubyte] data;
 
    static this()
    {
        data = [ 1: "bir", 2: "iki", 3: "üç" ];
    }
 
  string toString() @property {
    auto outText = appender!string;
    foreach(keys; data.keys) {
      formattedWrite(outText, "%s: %s\n", keys, data[keys]);
    }
    return outText.data;
  }
}
void main() {
  Foo bar;
  bar.writeln;
}

Ali
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kusura bakmayın hocam, uzun açıklama yapmadan kodu pıtırdanak diye yazaraktan...:)

ve de

denemeden yayınladım. Oysa şu satır ile çalışıyormuş:
import std.stdio, std.format, std.array;
Gerçi sorduğum soruyu yapıdan çıkarıp main() içinde de yapabiliriz. Asıl sorduğuma gelince bu başlıkta konu edilen writeUpToNextSpec() ve formatValue() olanaklarını kullanabilir miyiz? Çünkü çağrışımsal dizilerle bunu bir türlü eşleştiremedim ve bende geleneksel yöntemle (tıpkı writeln ile yazar gibi) yaptım.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #14
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ı
Buradaki asıl soru, "%s" belirteçlerini bir dizideki elemanlarla sırayla eşleştirmekle ilgiliydi. Dizinin elemanları belirli bir sırada olduklarından ve düzen dizgisindeki "%s"ler belirli bir sırada durduklarında o eşleme mantıklı oluyor. Örneğin ad ve soyad "Adım: %s\nSoyadım: %s" dizgisine sırayla yerleştiriliyorlar.

Eşleme tablolarındaki elemanlar belirsiz sırada olduklarından onlarda writeUpToNextSpec() ve formatValue() kullanan bir yöntem herhalde mantıklı olmaz. Daha doğrusu, genel bir çözüm olmaz: Bazı programlar sıraya önem vermezken bazı programlar belirli bir sırada istiyor olabilirler.

Tabii, sıralı isteyen programların çeşitli çözümleri var: eşleme tablosu yerine ikili ağaç kullanmak veya eşleme tablosunun .keys() niteliğini önce sort() etmek ve onu sırayla ilerlemek.

Eşleme tabloları olsa olsa "%(" ve "%)" gruplama belirteçleri ile uygun kullanılabilirler gibi geliyor. Baktım, zaten destekleniyormuş! :) Önemli olan, tablo elemanları için iki tane %s kullanmakmış:
import std.stdio;
 
void main()
{
    auto data = [ 1: "bir", 2: "iki", 3: "üç" ];
    writefln("%-(%s:%s\n%)", data);
}
Çıktısı:
1:bir
2:iki
3:üç

Yukarıdaki düzen dizgisi içindeki tire işareti string değerlerin çift tırnaklarını kaldırmaya yarıyor.

Konum belirteçleri de kullanılabiliyormuş:
import std.stdio;
 
void main()
{
    auto data = [ 1: "bir", 2: "iki", 3: "üç" ];
    writefln("%-('%2$s' değerini elde etmek için '%1$s' kullanınız%|\n%)",
             data);
}
Son eleman için de "kullanınız" yazdırılsın diye "%|" kullandım. Çıktısı:
'1' değerini elde etmek için 'bir' kullanınız
'2' değerini elde etmek için 'iki' kullanınız
'3' değerini elde etmek için 'üç' kullanınız


Ali
Avatar
Salih Dinçer #15
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
...

Eşleme tablolarındaki elemanlar belirsiz sırada olduklarından onlarda writeUpToNextSpec() ve formatValue() kullanan bir yöntem herhalde mantıklı olmaz. Daha doğrusu, genel bir çözüm olmaz: Bazı programlar sıraya önem vermezken bazı programlar belirli bir sırada istiyor olabilirler.

...
Hocam çok güzel ifade etmişsin. Açıkçası FormatSpec yapısını anlayamadığım için bunun peşinden bir süre gittim. Aslında daha çok anlamaya gayret ettim. Gayretlerim sonuçsuz kalınca, bir cevap bulmak için bu konuyu devam ettirmeye karar verdim. Neticede çözüm olamayacağını da öğrenmiş olduk ama hala anlamaya çalışıyorum... :blush:

Peki hocam aşağıdaki grafiğe bakar mısın; yanlış anlamıyorum, değil mi?

Gerçi kodlarını incelemedim ve tahmin yürütüyorum ama data şu şekilde geziyor olmalı:

: : : DATA : : : ----> formatValue() -----v
  ____________               ^         __________
 | FormatSpec | !char        ^        | appender | !string
  ============  @writeUpToNextSpec     ==========  @data ---v
[SPEC]---^                                                  v
                                                          (OUT)


Yani FormatSpec ile appender adında iki yapımız var ve bunları haberleştiren formatValue() işlevimiz. Düzen, ilk başta yapı kurulurken veriliyor ama bunu writeUpToNextSpec() ile veriyi biriktiren appender yapısına (yazıcı) eriştiriyoruz...

Allah Allah, bunu niye yapıyoruz?

Yani her iki işlev niye appender'a erişiyor, kafam almıyor...:)
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-15, 02:08.
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:
Sayfa:  1  2  sonraki 
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:19:58 (UTC -08:00)