SORU
27 ŞUBAT 2013, ÇARŞAMBA


Karmaşık C bildirisi

Sadece internet üzerinde bazı kod bakıyordum ve bunu buldum:

float * (*(*foo())[SIZE][SIZE])()

Bu bildirimi nasıl okuyabilirim? Böyle karmaşık bildirimleri okumak için belirli kuralları var mı?

CEVAP
27 ŞUBAT 2013, ÇARŞAMBA


Standart kural: en soldaki tanımlayıcısını bulmak ve yolunuzu çalışmak, [] olduğunu hatırlayarak ve * önce () alan:

            foo                      -- foo
            foo()                    -- is a function
           *foo()                    -- returning a pointer
          (*foo())[SIZE]             -- to a SIZE-element array
          (*foo())[SIZE][SIZE]       -- of SIZE-element arrays
         *(*foo())[SIZE][SIZE]       -- of pointers
        (*(*foo())[SIZE][SIZE])()    -- to functions
      * (*(*foo())[SIZE][SIZE])()    -- returning pointers
float * (*(*foo())[SIZE][SIZE])();   -- to float

Yani fonksiyonları float: işaretçiler dönen bir grup var düşünün

float *quux();
float *bar();
float *bletch();
float *blurga();

Hadi 2x2 bir tablo olarak saklamak istediğiniz dediler

float *(*tab[SIZE][SIZE])() = {quux, bar, bletch, blurga};

tab fonksiyonlar işaretçiler BOYUT x BOYUT bir dizi float işaretçiler dönüyor.

Şimdi bir fonksiyon bu tablo için bir işaretçi dönmek istiyorum karar verin

float *(*(*foo())[SIZE][SIZE])()
{
  static float *(*tab[SIZE][SIZE])() = {quux, bar, bletch, blurga};
  return &tab;
}

Farklı fonksiyonları tablo oluşturmak çeşitli fonksiyonları var, unutmayın, ya da aynı işlevleri farklı bir şekilde organize:

float *(*(*qwerbl())[SIZE][SIZE])()
{
  static float *(*tab[SIZE][SIZE])() = {blurga, bletch, bar, quux};
  return tab;
}

böyle bir şey yapmak için aklıma gelen tek sebep. Vahşi çok sık bu tür zaman zaman kırpma ve hızlı bir şekilde iğrenç yazı suçlu bulundum ancak) görmesinler.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Munchkin the Teddy Bear

    Munchkin the

    30 EYLÜL 2011
  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013
  • Vladimir Jenko

    Vladimir Jen

    1 Mart 2010