SORU
27 HAZİRAN 2009, CUMARTESİ


İki boyutlu bir dizi için bir işaretçi oluşturmak

2 boyutlu statik bir dizi için bir işaretçi ihtiyacım var. Bu nasıl yapılıyor?

static uint8_t l_matrix[10][20];

void test(){
   uint8_t **matrix_ptr = l_matrix; //wrong idea 
}

Hataları gibi her türlü olsun:

  • uyarı: uygun olmayan atama işaretçi türü
  • alt değer ne dizi ne de işaretçi
  • hata: esnek dizi kullanımı geçersiz üyesi

CEVAP
27 HAZİRAN 2009, CUMARTESİ


Burada istediğin bir dizinin ilk öğe için bir işaretçi

uint8_t (*matrix_ptr)[20] = l_matrix;

Typedef ile, bu temiz görünüyor

typedef uint8_t array_of_20_uint8_t[20];
array_of_20_uint8_t *matrix_ptr = l_matrix;

Sonra hayattan yeniden zevk :)

matrix_ptr[0][1] = ...;

C pointer/array world dikkat edin, fazla karışıklık bu civarında.

< / ^ hr .

Edit

Diğer cevaplar burada, yorum alanları nedeniyle bazı inceleme yapmak için çok kısa. Birden çok alternatif önermiş, ama onlar nasıl davranması gösterilen değildi. Bunu nasıl yaptıklarını burada

uint8_t (*matrix_ptr)[][20] = l_matrix;

Hata düzeltme ve adresi-operatör eklemek & aşağıdaki kod parçasında olduğu gibi

uint8_t (*matrix_ptr)[][20] = &l_matrix;

Sonra bir 20 uint8_t türü dizi elemanlarının eksik dizi bir türü için bir işaretçi oluşturur. İşaretçiyi bir dizi bir dizi için, çünkü, sen gir

(*matrix_ptr)[0][1] = ...;

Ve tamamlanmamış bir dizi için bir işaretçi var çünküolamazbir kısayol yap

matrix_ptr[0][0][1] = ...;

Çünkü dizin öğesi türünün bilinen boyutu (dizin işaretçisi bir tamsayı bir ek ifade eder, eksik türleri ile çalışmaz yani) gerektirir. Bu sadece T[] T[N] uyumlu türüdür çünkü C çalışır unutmayın. C diye bir kavram yokuyumlu türlerT[] T[10] farklı türleri vardır, çünkü bu kod reddetmek, böylece , ve.

< / ^ hr .

Aşağıdaki alternatif tek boyutlu bir dizi olarak görüntülemek dizi öğesi türü, çünkü hiç işe yaramazdeğiluint8_t ama uint8_t[20]

uint8_t *matrix_ptr = l_matrix; // fail

< / ^ hr .

Aşağıdaki iyi bir alternatif

uint8_t (*matrix_ptr)[10][20] = &l_matrix;

Size erişim

(*matrix_ptr)[0][1] = ...;
matrix_ptr[0][0][1] = ...; // also possible now

Dış boyutlar boyutu koruyan yararı vardır. Üzerinde boyutu uygulayabilirsiniz

sizeof (*matrix_ptr) == sizeof(uint8_t) * 10 * 20

< / ^ hr .

Bir dizideki öğeleri bitişik saklı olduğu gerçeğini bir şekilde kullanan başka bir cevap yoktur

uint8_t *matrix_ptr = l_matrix[0];

Şimdi, resmi olarak sadece iki boyutlu bir dizinin ilk öğesi öğeleri erişim sağlar. Diğer bir deyişle, aşağıdaki koşul tutun

matrix_ptr[0] = ...; // valid
matrix_ptr[19] = ...; // valid

matrix_ptr[20] = ...; // undefined behavior
matrix_ptr[10*20-1] = ...; // undefined behavior

Muhtemelen 10*20-1 için çalıştığını göreceksiniz ama eğer diğer analiz ve diğer agresif optimizasyon üzerine atarsan, bazı derleyici bu kodu kırabilir bir varsayım yapabiliriz. Bunu söyledikten sonra, ben daha önce karşılaşılan bir derleyici başarısız (ama sonra tekrar, ben değil kullanılan Bu teknikte gerçek kod) ve hatta C SSS olan teknik kontrol ile bir uyarı hakkında İK'ness), ve eğer değiştiremezsiniz dizi, yazın bu son seçenek için kaydedin :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChasesAndCrashes

    ChasesAndCra

    31 Temmuz 2009
  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • TouchePro

    TouchePro

    27 EYLÜL 2007