Sorunun Tarihi
C dilindeki çok boyutlu diziler başlangıçta tablolar ve matrislerle çalışmayı basit hale getirmek için tasarlanmıştır. Klasik iki boyutlu dizi - dizi dizileri, tabular verilerin elemanlarıyla basit bir sözdizimi ile çalışabilme imkanı sunar. Zamanla yaklaşım evrimleşti, özellikle değişken uzunluktaki dizilerle çalışırken.
Problemler
Yanlış ilan etme ve başlatma çok boyutlu dizilerin derleme hatalarına veya mantıksal arızalara yol açar. Çok boyutlu bir diziyi bir fonksiyona geçirirken pek çok geliştirici spesifikasyon gereksinimlerinden dolayı kafası karışır - ilk boyut hariç tüm boyutların boyutlarını açıkça belirtmek gerekir.
Çözüm
İki boyutlu dizinin ilanı:
int matrix[3][4];
Tam başlatma:
int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
Fonksiyona geçirme - ilk boyut hariç tüm boyutları açıkça belirtmek gerekir:
void printMatrix(int m[][3], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) printf("%d ", m[i][j]); printf(" "); } }
C99 standardının getirilmesiyle değişken uzunluktaki dizileri alan fonksiyonlar ilan edilebilir:
void foo(int rows, int cols, int a[rows][cols]);
Önemli Faktörler:
1. İki boyutlu bir diziyi ikinci boyutunu belirtmeden alabilen bir fonksiyon ilan edebilir miyiz?
Hayır, C derleme aşamasında, ilk boyut hariç tüm boyutların bilinmesini istemektedir. Bu, elemanlara erişim sırasında işaretçi aritmetiği ile ilgilidir.
Hata örneği:
// Hata: void process(int arr[][], int rows); // Olmaz
2. Çok boyutlu bir dizinin tüm elemanlarını başlatmazsak ne olur?
Geriye kalan elemanlar, eğer dizi statik veya global ise otomatik olarak sıfırlarla doldurulur. Kısmi başlatma ile yerel bir dizide de belirtilmemiş elemanlar sıfır olacak şekilde başlatılır.
int a[2][3] = {{1}, {4}}; // a[0][1] ve a[0][2], a[1][1] ve a[1][2] 0 olur
3. İşaretçi dizisi ile iki boyutlu dizi arasındaki fark nedir?
İki boyutlu dizi tek bir bellek bloğudur. İşaretçi dizisi, ayrı (belki de ayrı olarak tahsis edilmiş) bir boyutlu dizilere işaret eden işaretçiler dizisidir. Bu, „yırtık“ dizilere bellek tahsis etme gibi durumlarda önemlidir.
İki boyutlu bir diziyi ikinci boyutunu belirtmeden tanımlama ve geçirme girişimi, derleme hatasına yol açar. Yüzeysel bir düzeltmeyle işaretçi ile değiştirmek, sonraki hesaplamalarda belirsiz veya yanlış davranışa yol açar.
Artılar:
Eksiler:
Geliştirici, tüm boyutların boyutlarını açıkça belirtir, bellek içindeki elemanların saklanma düzenine açıklık getirecek şekilde belgeler, böylece sonraki bakım sırasında hata sayısını azaltır.
Artılar:
Eksiler: