September 09, 2010

Alıntı:

>

Zaten yeni başlayanlar için fazla karışık... :/

Bende şimdi denedim ve çalışmıyor. Ancak şimdi çok beğendim. Örneğin teoride şu çalışması gerekiyor (sonsuz parametre alabiliyor. Ne güzel :-) ) :

import std.stdio;

void main() {

   char a;
   wchar b;
   dchar c;

   readf("%s", &a,&b,&c);

}

Ayrıca tür dönüşümü yapmadan int türüne bile okuduğumuzu koyabiliyor olmamız lazım.


import std.stdio;

void main() {

   int a;
   int b;
   int c;

   readf("%d", &a,&b,&c);

}

Şuan readf yerine yine std.stdio'da bulunan readln kullanılabilir. Ancak string olarak değer dönüştürdüğünde tür dönüşümü yapmak gerekiyor. Ancak cast ile dönüşüm yapılamıyor. conv'deki to şablonuda hatalı sanırım. stringin char'a dönüştürülememesi hata mıdır, yoksa normal midir ?

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

September 09, 2010

Alıntı:

>

Ama orada her okunan için bir düzen karakteri olması gerekiyor: "%s %s %s". Hata da o durumda çalışmaması zaten.

Alıntı:

>
  • string'de birden fazla karakter varsa ilkini mi istiyoruz?

olabilir
Alıntı:

>
  • string'de birden fazla karakter varsa, ama örneğin dchar'a dönüştürüyorsak acaba UTF-8'den UTF-32'ye dönüşüm mü istiyoruz?

olabilir.

Ancak şu bile çalışmıyor :

import std.conv;
void main(){
   char b;
   string a="a";
   b=to!(char)(a);
}

To şablonunda hata var diyeceğim ancak cast içinde :

import std.conv;
void main(){
   char b;
   string a="a";
   b=cast(char)a;
}

hatalı.

a.dup şeklide hatalı tabi :

import std.conv;
void main(){
   char b;
   string a="a";
   b=a.dup;
}

İlk elemenına erişmek istersem yine hatalı :

import std.conv;
void main(){
   char b;
   string a="a";
   b=a[0].dup;
}

Aklıma gelen tek çözüm stringi char dizisine cevirip sonra chara çevireceğiz. Sanırımbunun nedeni çift tırnak kullanıldığında dizi olarak kabul edilmesi. Ancak dizi olsada kaç elemanı var ki ? 1

import std.stdio;
import std.conv;
void main(){
   char b;
   string a="a";
   writeln(a.length);
}

Bana ilk başlarda tek tırnak karakter olarak algılanması ve çift tırnağın karakter dizisi olarak algılanması garip gelmişti. Belki bunun sonucudur ?

Eğer D kendi çözüm getirmeyecekse çözümü getirecek ve en başta sorduğunuz o iki işide gerçekleştircek küçük bir kütüphane çok güzel olabilir.

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

September 09, 2010

Alıntı:

>

Tabii. Çünkü aynı şey: kopyası da string...

Ben dup ile mutable olarak kopyalandığını idup immutable ile kopyalandığını düşünüyordum.

Her dediğiniz kabul. Ben sanırım bazı konuları karıştırmışım. Dün dizileri okuyordum. Orada ne zaman dilim oluyor ne zaman dilimlikten çıkıyor, ayrıca bir dizi adını yazarken ne zaman [] karakteri kullanılıyor derken karıştırmışım.

Örneğin şurada çok güzel bir olanak var. Ancak anlamadığım yerler var. :

import std.stdio;

void main(){
   double[] sayı = [1,5,9,5,5,2,3];

   sayı[]= (sayı[]+3)/2;// Burada [] kullanmak şart. Peki neden şart ?
   writeln(sayı); // Burada tüm elemanı yazarken şart mı değil mi ? Dmd'nin bir hatası mı var ?
}

D'de dizilerin çok fazla ayrıntısı var.

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

September 09, 2010

Alıntı:

>
  • dizi isminden sonra [] kullanıldığında "o dizinin eriştirdiği bütün elemanlar" anlamına geliyor

Bende öyle düşünüyorum.

Alıntı:

>
    double[] sayı = [1,5,9,5,5,2,3];
    sayı[]= (sayı[]+3)/2;// Burada [] kullanmak şart. Peki neden şart?

Bence o bir dmd sorunu. Anlaşılan, sağ taraftaki hesabı yapabilmek için solda bir dizi eleman olmasını bekliyorlar. Oysa, sağ tarafta bir işlem yapabilirlerdi, o işlemin sonucu bir "dizi eleman" olurdu, ve sayı= deyince de sayı artık o yeni elemanlara erişim sağlamaya başlayabilirdi.

Bence dmd'nin sorunu değil. Kitapta array-wise (akıllı diziler?) bölümünde de bu şekilde kullanılmış.

Sanırım sadece array-wise için [] kullanmalıyız. Açıklama array wise için içindeki her elemana tek tek erişiyor.

Ancak bir diziyi döndürdüğümüzde içindeki elemana tek tek erişmiyor. Sadece bellek adresi ile uzunluğu döndürülüyor. Bu yüzden [] kullanmamıza gerek yok.

Bu açıklamayı kendime yaptım ve evet mantıklı geldi.

O zaman writeln(dizi[]) şeklindeki kullanım hatalı kullanım olmalı?

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

September 09, 2010

Alıntı (canalpay):

>

Örneğin teoride şu çalışması gerekiyor (sonsuz parametre alabiliyor. Ne güzel :-) ) :

> import std.stdio;
>
> void main() {
>
>     char a;
>     wchar b;
>     dchar c;
>
>     readf("%s", &a,&b,&c);
> ```


Ama orada her okunan için bir düzen karakteri olması gerekiyor: "%s %s %s". Hata da o durumda çalışmaması zaten.

Alıntı:
> Ayrıca tür dönüşümü yapmadan int türüne bile okuduğumuzu koyabiliyor olmamız lazım.
>
>
>

import std.stdio;

void main() {

int a;
int b;
int c;

readf("%d", &a,&b,&c);

Evet, onun da "%d %d %d" ile çalışması gerek. Ve... O çalışıyor! ;)

Hatta, "%s %s %s" kullanınca da çalışıyor. Çünkü "%s"nin anlamı "değişkenin türüne göre oku" demek oluyor.

Ve senin de dediğin gibi, aslında düzen bilgisi kullanmadan da okuyabilmeliyiz. Yani aslında şöyle kullanılabilmeli:

   readf(&a, &b, &c);

Çünkü zaten din.readf düzen dizgisi almadan okuyabiliyor.

Alıntı:

>

Şuan readf yerine yine std.stdio'da bulunan readln kullanılabilir.

Evet, ama o '\n' karakterini de okuyor. Şöyle bir şey denemiştik galiba:

import std.stdio;
import std.string;
import std.conv;

void main()
{
   string line = strip(stdin.readln());

   auto i = parse!int(line);
   auto d = parse!double(line);
//     auto s = parse!string(line); ÇALIŞMIYOR

   writeln(i, ' ', d);
}

parse!string çalışmadığı gibi, o programın çalışması için girişin de tek satır olarak gelmesi gerekiyor. Örneğin int'i yazıp Enter basılamıyor. Ama şöyle bir giriş tamam: 42 1.25

Bunların hiçbirisi çözülemeyecek sorunlar değil ama yeni başlayanlara uygun olmadığı açık.

Alıntı:

>

conv'deki to şablonuda hatalı sanırım. stringin char'a dönüştürülememesi hata mıdır, yoksa normal midir ?

İlginç bir soru. :) Aklıma gelen sorunlar:

  • string'de birden fazla karakter varsa ilkini mi istiyoruz?
  • string'de birden fazla karakter varsa, ama örneğin dchar'a dönüştürüyorsak acaba UTF-8'den UTF-32'ye dönüşüm mü istiyoruz?

Programcılıkta bazen en iyi çözüm, kararın zor olduğu durumlarda çözümü programcıya bırakmaktır. :) Bu durumda string'den karaktere dönüşümü yasaklamak, o tür soruları yanıtlamaktan kurtarıyor. Çünkü programcı kendisi seçebilir.

Ali

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

September 09, 2010

Alıntı (canalpay):

>

Alıntı:

>
  • string'de birden fazla karakter varsa ilkini mi istiyoruz?

olabilir

Ama kütüphanenin o kararı veremeyeceğini anlayabiliyorum. Hatta bazı durumlarda istenmeyen bir hata bile olabilir. İlk karakter istendiğinde açıkça 'dizgi[0]' yazabiliyoruz nasıl olsa.

Alıntı:

>

Alıntı:

>
  • string'de birden fazla karakter varsa, ama örneğin dchar'a dönüştürüyorsak acaba UTF-8'den UTF-32'ye dönüşüm mü istiyoruz?

olabilir.

O kabul edilebilir sanırım. Ama o da yine aynı soruna sahip: string'in uzunluğu 5 ise UTF-8'den dönüşebilen ilk Unicode karakterini mi dönüştürsün? İlk karakterin kodlaması 3 char geretiriyorsa onları mı kullansın?

Bence de olabilir ama karışıklık doğurabilecek garip kararlar bunlar. :) Yine programcıya bırakmak daha iyi.

Alıntı:

>

Ancak şu bile çalışmıyor :

> import std.conv;
> void main(){
>     char b;
>     string a="a";
>     b=to!(char)(a);
> ```


Orada string'in uzunluğu 1 olduğu için izin verilmesini bekleyebiliyoruz herhalde. Ama string bir parametre olsa? Yani uzunluğu derleme zamanında bilinmese? Sanırım izin verilmemesinin nedeni o.

Alıntı:
>
> a.dup şeklide hatalı tabi :
>
>
>

import std.conv;
void main(){
char b;
string a="a";
b=a.dup;
}

Tabii. Çünkü aynı şey: kopyası da string...

Alıntı:

>

İlk elemenına erişmek istersem yine hatalı :

> import std.conv;
> void main(){
>     char b;
>     string a="a";
>     b=a[0].dup;
> }
> ```


Orada .dup yazılmasa çalışıyor. Çünkü ilk elemanının türü char zaten.

Alıntı:
>
> Aklıma gelen tek çözüm stringi char dizisine cevirip sonra chara çevireceğiz. Sanırımbunun nedeni çift tırnak kullanıldığında dizi olarak kabul edilmesi.

Evet, string zaten char dizisi.

Alıntı:
>  Ancak dizi olsada kaç elemanı var ki ? 1
>
>

import std.stdio;
import std.conv;
void main(){
char b;
string a="a";
writeln(a.length);
}

Uzunluğunun 1 olduğunu bu örnekte biliyoruz. Ama derleyici kod üretirken belirli kuralların dışında akıllılık göstermemelidir. Onun elindeki sorun, string'in char'a dönüştürülmesi. O işi yapan bir kütüphane işlevi bulamıyor. Onun işi orada bitiyor.

Daha ileriye giderek, o dizginin uzunluğunun derleme zamanında biliniyor olmasına bakarak karar vermez. Öyle olsa, bugün derlenen program ilerideki bir zamanda derlenemeyebilir. Kodu değiştirip string bir parametreyi kullanmaya başlasak, artık derleyici o akıllılığı gösteremez ve program derlenemez.

Alıntı:

>

Bana ilk başlarda tek tırnak karakter olarak algılanması ve çift tırnağın karakter dizisi olarak algılanması garip gelmişti. Belki bunun sonucudur ?

Tek tırnak, tek karakter oluyor; çift tırnak ise karakter dizisi.

Alıntı:

>

Eğer D kendi çözüm getirmeyecekse çözümü getirecek ve en başta sorduğunuz o iki işide gerçekleştircek küçük bir kütüphane çok güzel olabilir.

Ama o soruların yanıtlarını verebilmeliyiz. Dizginin ilk karakterini mi kullanacağız? Bence programcının 'dizgi[42]' diye seçmesi çok daha açık olur ve istenmeden yanlış derlenme durumunu ortadan kaldırır.

Ali

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

September 09, 2010

Alıntı (canalpay):

>

Alıntı:

>

Tabii. Çünkü aynı şey: kopyası da string...

Ben dup ile mutable olarak kopyalandığını idup immutable ile kopyalandığını düşünüyordum.

Sen haklısın. Ben de az haklıyım ama: ben string'i "karakter dizisi" diye kullanmışım anlaşılan. Erişim hakları farklı ama sonuçta dizi olduğu için aynı sorunla karşı karşıya.

Alıntı:

>

Ben sanırım bazı konuları karıştırmışım. Dün dizileri okuyordum. Orada ne zaman dilim oluyor ne zaman dilimlikten çıkıyor, ayrıca bir dizi adını yazarken ne zaman [] karakteri kullanılıyor derken karıştırmışım.

Yalnız değilsin! :) Özellikle C dillerinden gelenler bu konularda karışıklık yaşayacaklardır.

Önce burada ilgili olduğunu düşündüğüm bir bilgiyi hatırlayayım. (Daha çok kendime söylüyorum. ;)) Dizi ismi, bir eleman topluluğunun referansıdır.

  • eşitliğin solunda bir dizi ismi kullanıldığında, o dizi artık yeni elemanlara erişim sağlamaya başlar:
   sayı = [ 10, 20 ];

sayı, artık eski elemanları bırakır, bunlara erişim sağlar

  • dizi isminden sonra [] kullanıldığında "o dizinin eriştirdiği bütün elemanlar" anlamına geliyor
   sayı[] = 7;

O, bütün elemanları 7'ye eşitliyor. Benim anladığım böyle. :D

Alıntı:

>
>     double[] sayı = [1,5,9,5,5,2,3];
>     sayı[]= (sayı[]+3)/2;// Burada [] kullanmak şart. Peki neden şart ?
> ```

>

Bence o bir dmd sorunu. Anlaşılan, sağ taraftaki hesabı yapabilmek için solda bir dizi eleman olmasını bekliyorlar. Oysa, sağ tarafta bir işlem yapabilirlerdi, o işlemin sonucu bir "dizi eleman" olurdu, ve sayı= deyince de sayı artık o yeni elemanlara erişim sağlamaya başlayabilirdi.

Neden böyle olduğunu bilmiyorum. Yani belki geçerli bir nedeni vardır.

Alıntı:
>
> D'de dizilerin çok fazla ayrıntısı var.
>

Bence de... :)

Ali

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

Alıntı (canalpay):

>

Kitapta array-wise (akıllı diziler?) bölümünde

-wise, son ek olarak kullanıldığında, eklendiği şey "kapsamında" gibi bir anlama da geliyor. Örneğin clockwise, saatin ilerlediği yönde demek...

Andrei'nin hangi anlamda kullandığından emin olamam. :)

Alıntı:

>

O zaman writeln(dizi[]) şeklindeki kullanım hatalı kullanım olmalı?

Bence değil, çünkü o durumda dizinin bir dilimini almış oluyoruz. Dilimler de dinamik dizilerle aynı şey oldukları için bence orada bir sorun yok.

Ali

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

September 13, 2010

Alıntı:

>

Herhalde Python yüzünden değil mi? Ben de bugün Python'da karakter diye bir tür olmadığını öğrendim (veya yeniden öğrendim :)). Karakter, uzunluğu 1 olan dizgiymiş.

Büyük ihtimalle hiç bir dinamik programlama dilinde yoktur bu ayrım. Benim baktığım tüm dillerde 'merhaba dünya' ile "merhaba dünya" arasında fark yoktu.

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

September 13, 2010

Alıntı (canalpay:1284057825):

>

Bana ilk başlarda tek tırnak karakter olarak algılanması ve çift tırnağın karakter dizisi olarak algılanması garip gelmişti.

Herhalde Python yüzünden değil mi? Ben de bugün Python'da karakter diye bir tür olmadığını öğrendim (veya yeniden öğrendim :)). Karakter, uzunluğu 1 olan dizgiymiş.

Ali

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

1 2
Next ›   Last »