Katar dizileri neden çok boyutlu diziler gibi yazılıyor?

tablo [] [80] = {"pazartesi", "sali", "carsamba"} 

şeklinde yazmamız doğruyken neden

tablo[] = {"x", "y", "z"}

şeklinde yazamıyoruz?

Yanılmıyorsam tablo[x][y] ifadesindeki x, dizide kaç eleman olacağını; y de maksimum eleman uzunluğunun ne kadar olacağını belirtiyor.

Bu arada diziler aşağıda gösterildiği gibi de tanımlanabiliyor:

string tablo[] = {"pazartesi", "sali", "carsamba"};

veya şöyle:

const char *tablo[] = {"pazartesi", "sali", "carsamba"};

veya şöyle:

#include <vector>

int main(){
    vector <string> tablo = {"pazartesi", "sali", "carsamba"};
    /* ... 
       ...
       ...
    */
}

Yazabiliyoruz:

#include <stdio.h>

int main(void)
{
	typedef char *str;
	str tablo[] = {"x", "y", "z"};

	printf("%s %s %s\n", tablo[0], tablo[1], tablo[2]);

	return 0;
}

[]'lari birbirinden ayirmamakta fayda var; ikisi de dizide kac eleman olacagini belirtiyor. Sagdaki en ic dizi ve y elemanli. Soldaki disaridaki dizi ve x elemanli, elemanlari da ilk dizi.

char tablo[][80] = {"pazartesi", "sali", "carsamba"}; dedigimizde, 80 karakterlik dizilerden olusan 3 elemanli bir dizi declare, define ve initialize ediyoruz. Toplam boyu 240 byte.

const char *tablo[] = {"pazartesi", "sali", "carsamba"}; Burada 3 pointer’lik bir dizi var (~12, 24 byte)

std::vector <std::string> tablo = {"pazartesi", "sali", "carsamba"}; Bu yeni bir C++ sentaksi, ne yaptigindan emin degilim. (Ne yaptigi belli de standardin neresindeki hangi cumleden yola cikarak neyi neye cevirdigini bilmiyorum.)

1 Like

Denediğim bir kaç örnekten yola çıkarak köşeli parantezlerin farklı şeyleri belirttiğini düşünmüştüm.
Mesela şöyle bir kod yazıyorum:

#include <iostream>

using namespace std;

int main(){
	char tablo[2][80] = {"pazartesi", "sali", "carsamba"};
        /* ... */
}

Aşağıdaki gibi bir hata veriyor:

a1.cpp:7:54: error: too many initializers for ‘char [2][80]’
  char tablo[2][80] = {"pazartesi", "sali", "carsamba"};

"carsamba" stringini çıkarıyorum listeden ve tekrar derlemeye çalışıyorum. Bu sefer sorun çıkmıyor. Bu yüzden ilk köşeli parantezin, listedeki eleman sayısıyla ilgili olduğunu düşündüm.

Daha sonra şöyle bir kodu derlemeye çalıştım:

#include <iostream>

using namespace std;

int main(){
	char tablo[][1] = {"pazartesi", "sali", "carsamba"};
        /* ... */
}

Bu sefer aldığım hata şöyle oldu.

a1.cpp: In function ‘int main()’:
a1.cpp:7:52: error: initializer-string for array of chars is too long [-fpermissive]
  char tablo[][1] = {"pazartesi", "sali", "carsamba"};
                                                    ^
a1.cpp:7:52: error: initializer-string for array of chars is too long [-fpermissive]
a1.cpp:7:52: error: initializer-string for array of chars is too long [-fpermissive]

Bu hatadan ötürü de ikinci köşeli parantezin, dizi içindeki maksimum string uzunluğu ile ilgili olduğunu düşündüm.

Pratikte oyle ama “string dizisi” veya “listedeki eleman sayisi” gibi dusunceler anlamaya engel teskil ediyori zorlastirabiliyor.

char tablo[2][80] = {"pazartesi", "sali", "carsamba"};

Burada iki tane iki boyutlu array var. Sagdaki, soldakine sigmiyor ve sorun orada.

char tablo[][1] = {"pazartesi", "sali", "carsamba"};

Burada da keza. Ilk ornekteki array’lerin ilk boyutlari uyusmazken bunlarin ikinci boyutlari uyusmuyor.

Birkac ornek de ben vereyim:

a.c:5:63: warning: excess elements in array initializer
  int     ilki_kisa[1][2][3] = { { { 0, 1, 2 }, { 3, 4, 5 } }, { { 6 } } };
                                                               ^
a.c:5:63: note: (near initialization for ‘ilki_kisa’)
a.c:6:61: warning: excess elements in array initializer
  int ikincisi_kisa[1][2][3] = { { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } } };
                                                             ^
a.c:6:61: note: (near initialization for ‘ikincisi_kisa[0]’)
a.c:7:59: warning: excess elements in array initializer
  int ucuncusu_kisa[1][2][3] = { { { 0, 1, 2 }, { 3, 4, 5, 6 } } };
                                                           ^

Burada da hata son boyutta elemana isaret ederken onceki boyutlarda diziye isaret ediyor. Ama butun bunlar compiler’in bize yardimci olma calismalarinin sonucu. Sorun yine ayni; sagdaki array soldakine buyuk kaliyor.

1 Like

Cevabınız için teşekkür ederim. C ve C++ ile yeni yeni ilgilenmeye başladığım için bazı durumları Python’da kullandığım terimlerle anlatmaya çalışıyorum. :slight_smile:

Onemli olan string literallerinin karakter array’leri oldugunu akilda bulundurmak:

"hede"{ 'h', 'e', 'd', 'e', '\0' }

2 Likes