Forum: D Programlama Dili RSS
D'de diziler hem kolay hem zor
acehreli (Moderatör) #1
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ı
Konu adı: D'de diziler hem kolay hem zor
Dizilerle ilgili dersi yazarken şuna takıldım:

import std.stdio;
 
void main()
{
    // Ancak başına 'static' yazınca derleniyor
    int[200] seyrek_dizi = [ 50:111, 100:111 ];
 
    int indeks;
    while (indeks < seyrek_dizi.length) {
        write(seyrek_dizi[indeks], " ");
        ++indeks;
    }
 
    writeln();
}

Orada dizi tanımını static veya const yapmak gerekiyormuş. Koymayınca ilgisiz bir mesaj veriyor. (?) Daha anlamadım... :( Anlayan varsa anlatsın... :)

Ayrıca slice'ların yazımı da çok karışık. (Bu derste anlatmayacağım; sonraya bırakıyorum.) Dinamik diziye çok benziyor:

import std.stdio;
 
void main()
{
    int[10] statik_dizi;
    // statik_dizi.length = 7;  // HATA: uzunluğu değişmez
    
    int[] dinamik_dizi;
    dinamik_dizi.length = 10;   // uzunluğu değişir
 
    // dilim, statik_dizi'nin elemanlarına bir referans
    // oluyor.
    int[] dilim = statik_dizi[5..8];
    dilim[0] = 1; // statik_dizi[5]'e karşılık geliyor
    writeln("dilim, statiği değiştirdi  : ", statik_dizi[5]);
 
    // Sonundaki dup'a dikkat:
    int[] kopya = statik_dizi[5..8].dup;
    kopya[1] = 2; // statik_dizi[6]'nın kopyası
    writeln("kopya, statiği değiştirmedi: ", statik_dizi[6]);
}

Yani dilim'i değiştirince asıl dizi değişiyor, ama tabii kopya'yı değiştirince değişmiyor. Ama yazımlarındaki fark, o sondaki .dup. Bence farkını daha belirgin yapmalıymışlar. (Bir önerim yok ama. :D )

Ali
Mengu (Moderatör) #2
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Dizilerle ilgili dersi yazarken şuna takıldım:

import std.stdio;
 
void main()
{
    // Ancak başına 'static' yazınca derleniyor
    int[200] seyrek_dizi = [ 50:111, 100:111 ];
 
    int indeks;
    while (indeks < seyrek_dizi.length) {
        write(seyrek_dizi[indeks], " ");
        ++indeks;
    }
 
    writeln();
}

Orada dizi tanımını static veya const yapmak gerekiyormuş. Koymayınca ilgisiz bir mesaj veriyor. (?) Daha anlamadım... :( Anlayan varsa anlatsın... :)

ustadim static array initializer kullanmamizdan dolayi dizinin static olarak tanimlanmasi gerekiyor. basta initializer'in mantigini anlayamamistim fakat diyelim ki 50. anahtari 5 olan 53 elemanli bir diziyi su sekilde tanimlamak daha iyidir:

static int[54] b = [50:5, 7, 9, 11];
int z = 0;
foreach (int j; b)
{
    writefln("%d => %d", z, j);
    z++;
}
ustteki kodlarin kodlarin ciktisi soyle:
anahtar => deger
0 => 0
1 => 0
2 => 0
3 => 0
4 => 0
5 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 0
11 => 0
12 => 0
13 => 0
14 => 0
15 => 0
16 => 0
17 => 0
18 => 0
19 => 0
20 => 0
21 => 0
22 => 0
23 => 0
24 => 0
25 => 0
26 => 0
27 => 0
28 => 0
29 => 0
30 => 0
31 => 0
32 => 0
33 => 0
34 => 0
35 => 0
36 => 0
37 => 0
38 => 0
39 => 0
40 => 0
41 => 0
42 => 0
43 => 0
44 => 0
45 => 0
46 => 0
47 => 0
48 => 0
49 => 0
50 => 5
51 => 7
52 => 9
53 => 11

int[4] a = [5, 7, 9, 11];
int k = 0;    
foreach (int i; a)
{
    writefln("%d => %d", k, i);
    k++;
}
fakat bir ustteki kodlarin da ciktisi boyle:
anahtar => deger
0 => 5
1 => 7
2 => 9
3 => 11

Ayrıca slice'ların yazımı da çok karışık. (Bu derste anlatmayacağım; sonraya bırakıyorum.) Dinamik diziye çok benziyor:

import std.stdio;
 
void main()
{
    int[10] statik_dizi;
    // statik_dizi.length = 7;  // HATA: uzunluğu değişmez
    
    int[] dinamik_dizi;
    dinamik_dizi.length = 10;   // uzunluğu değişir
 
    // dilim, statik_dizi'nin elemanlarına bir referans
    // oluyor.
    int[] dilim = statik_dizi[5..8];
    dilim[0] = 1; // statik_dizi[5]'e karşılık geliyor
    writeln("dilim, statiği değiştirdi  : ", statik_dizi[5]);
 
    // Sonundaki dup'a dikkat:
    int[] kopya = statik_dizi[5..8].dup;
    kopya[1] = 2; // statik_dizi[6]'nın kopyası
    writeln("kopya, statiği değiştirmedi: ", statik_dizi[6]);
}

Yani dilim'i değiştirince asıl dizi değişiyor, ama tabii kopya'yı değiştirince değişmiyor. Ama yazımlarındaki fark, o sondaki .dup. Bence farkını daha belirgin yapmalıymışlar. (Bir önerim yok ama. :D )

Ali

zannediyorum bu konunun cevabi da dokumantasyonda yazan su kisim:

Slicing an array means to specify a subarray of it. An array slice does not copy the data, it is only another reference to it. For example:
http://www.mengu.net - some kind of monster
acehreli (Moderatör) #3
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ı
static konusundan hâlâ tam emin değilim. Mengu'nun örneklerinde şunda static gerekiyor:

static int[54] b = [50:5, 7, 9, 11];

ama şunda gerekmiyor:

int[4] a = [5, 7, 9, 11];

Bence birinci kullanımda static gerekmesi bir hata... (?)


Dilim konusunu da anlıyorum ama dinamik diziyle yazımlarının fazlasıyla benzemesinden şikayetçiyim. Tanımın sol tarafından bunu anlamak olanaksız:

int[] dilim        = ...;
int[] dinamik_dizi = ... .dup;

Tek fark, sağ tarafın sonunda bir .dup veya .idup bulunuyor olması. Hemen ismin baş tarafına bakıp anlayabilmeliydik. Sevmedim! :)

Ali
Mengu (Moderatör) #4
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
static konusundan hâlâ tam emin değilim. Mengu'nun örneklerinde şunda static gerekiyor:

static int[54] b = [50:5, 7, 9, 11];

ama şunda gerekmiyor:

int[4] a = [5, 7, 9, 11];

Bence birinci kullanımda static gerekmesi bir hata... (?)

ikincisinde gerekmemesinin sebebi static array initializer kullanmamis olmamiz abi. :) yani adamlar diyor ki, kardesim eger bu static array initializer'i kullaniyorsan, diziyi static olarak tanimlayacaksin; tanimlamiyorsan, static array initializer'i kullanmayacaksin. :)

Dilim konusunu da anlıyorum ama dinamik diziyle yazımlarının fazlasıyla benzemesinden şikayetçiyim. Tanımın sol tarafından bunu anlamak olanaksız:

int[] dilim        = ...;
int[] dinamik_dizi = ... .dup;

Tek fark, sağ tarafın sonunda bir .dup veya .idup bulunuyor olması. Hemen ismin baş tarafına bakıp anlayabilmeliydik. Sevmedim! :)

Ali

ben de slice isleminde neden referans olarak atandigini anlamis degilim. yani ille donguye alip yeni dizi mi yaratalim? madem kisa bir sey koydunuz, niye bizi yoruyorsunuz? :)
http://www.mengu.net - some kind of monster
Bu mesaj Mengu tarafından değiştirildi; zaman: 2009-08-11, 10:33.
acehreli (Moderatör) #5
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ı
Kendi tanımlarına bakılırsa ikincisinde de 'static initializer' kullanıyoruz:

Static initalizations are supplied by a list of array element values enclosed in [ ]

Yani, köşeli parantez içinde verilen eleman değerlerine statik ilk değerler deniyor. İki nokta üst üste kullanılması ise seçime bağlı; tanımı değiştirmiyor:

The values can be optionally preceded by an index and a :.

Bunun bir hata olduğunu düşündüğüm için dmd'mi yeniledim: 2.028'den 2.031'e geçtim ve hata mesajının değiştiğini gördüm (gelişmekte olan teknolojiyle uğraşmak zor iş :p):

dmd: init.c:431: virtual Expression* ArrayInitializer::toExpression(): Assertion `j < edim' failed.


Dilim konusunu hâlâ tutarlı bir şekilde açıklayamıyorum. :(

Ali
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ı
Bu D daha çok genç! :D Bir derleyici hatası daha bulduk (2.031 sürümünde):

  http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

Bunu yazdığım anda hâlâ aradığım yanıtı bulabilmiş değilim. Şunların hangisi yasal hangisi değil?

void main()
{
    int[2] static_0 = [ 1, 1 ];
    int[2] static_1 = [ 1:1 ];
}

Bir de işin içine onların global alanda veya bir fonksiyonda tanımlanmaları konusu girdi... (?) Yasal olup olmamalarını o konu etkiliyormuş (galiba?)...

Ali
acehreli (Moderatör) #7
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 tane de şurada:

  http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

int[] a = ...;

yazıldığı zaman a normalde sağdaki diziye veya dizi dilimine (slice) referans oluyor. Ama soruda sorduğum gibi şöyle yazıldığında:

int[] a = [ 0, 1, 2 ];

Sağdaki immutable (değişmez) dizinin bir kopyası alınıyor(muş)! Orada Steven Schveighoffer bu konunun kendisini de rahatsız ettiğini söylüyor.

Aynı konuda Lars T. Kyllingstad'ın söylediğine bakılırsa dizi kavramları yakında değişiyormuş. T[] ve T[new] yazımlarının değişik anlamları olacakmış.

Hmmm... Bu siteyi çoook erken başlattık galiba! :D Ama sonunda hepimiz bu dili taaa eski zamanlarından öğrenmiş olacağız! :)

Ali
Mengu (Moderatör) #8
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #6
acehreli:
Bu D daha çok genç! :D Bir derleyici hatası daha bulduk (2.031 sürümünde):

  http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

Bunu yazdığım anda hâlâ aradığım yanıtı bulabilmiş değilim. Şunların hangisi yasal hangisi değil?

void main()
{
    int[2] static_0 = [ 1, 1 ];
    int[2] static_1 = [ 1:1 ];
}

Bir de işin içine onların global alanda veya bir fonksiyonda tanımlanmaları konusu girdi... (?) Yasal olup olmamalarını o konu etkiliyormuş (galiba?)...

Ali

abi static_0'da tanimladigin dizide 0. indexin degeri 1, 1. indexin degeri 1. ikincisinde, 0. indexin degeri 0, 1. indexin degeri 1. ikisinin de yasal olmamasi icin herhangi bir sebep var mi?
http://www.mengu.net - some kind of monster
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ı
Ben de yasal olmaması için hiçbir neden göremiyorum. Belgelerine de uyuyor.

Ama hem derleyici yalnızca birisi için hata verince, hem de İngilizce forumda insanlar global alanla main içinde farklı çalışması gerektiğini söyleyince şaşırıyorum.

Ben de Mengu gibi anlıyorum ama çelişkiler var... :)

Ali
acehreli (Moderatör) #10
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ı
Yukarıda verdiğim forum bağlantılarına tekrar baktım. Dizilerde büyük değişikler olmak üzereymiş. Onun için ben derslerin dizi bölümünü şimdilik C ve C++'da oldukları gibi anlatacağım.

D'nin dizi özelliklerini sonraki bir derse bırakacağım. (Dersi zaten yazdım ama bilgilerden doğal olarak emin olamadım.) :D

Ali
Mengu (Moderatör) #11
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
hevesimizi kaciriyorlar yav. :D
http://www.mengu.net - some kind of monster
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ı
Yok yok! Böylesi daha zevkli... :)

Ali
Avatar
esatarslan52 (Moderatör) #13
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #11
Benim için şöyle iyi bir yanı var. Bundan 5-10 yıl sonra kısmet olurda öğretmen olursam öğrecilerime D yi anlatırken ben bu keratanın çocukluğunu bilirim diyebilcem :D.
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: 2017-11-23, 23:25:58 (UTC -08:00)