2015-09-02 25 views
1

我正在通過初始化程序列表將一個3D數組賦值給一個結構體,以利用成員級複製。我感興趣的是做這樣的事情發生了什麼描述in this post about array copying爲什麼在C++ 3d數組列表分配中需要額外支架?

這似乎是工作,但不能沒有增加額外的一套支架來完成:

struct Options 
    { 
    char array [20][20][20]; 
    }; 

int main(void) 
    { 
    Options K = {{ { "-x", "-o" }, { "-y", "-p", "-q" }, {"-r", "-s"} }}; 
    }; 

最外面的括號是封裝值被分配。下一對是我無法解釋的額外配對。的3個維度被分配有:

  • X =數串的括號內的基團的
  • Y =串的每個組中的數
  • Z =字符的每個字符串數

這通常不會擔心我,因爲一切都被複制了。但是,賦值之後,應該在內存中連續的最內層值將被多個額外維度間隔開。例如,用「20」字節分隔「-x」和「-o」,實際上它們分隔20 * 20字節。我很困惑。如何在不添加額外維度的情況下實現這一目標?

+0

什麼「似乎有效,但無法完成」是什麼意思? – juanchopanza

+1

什麼?!*你*是一個要求'[20] [20] [20]'如果你只想要''[3] [3] [3]',你可以改變你的結構。 –

+1

「-x」不能存儲在字符中。你實際上需要'char * array [3] [3] [3];'或者''x''用'char'。 – HelloWorld

回答

0

直接回答你的問題在你的代碼:

Options K = { // struct 
       { // array 
       { // array[0] 
        "-x", // array[0][0] with 3 chars, as string literal 
        {  // array[0][1] with 3 chars, transformed in braced form by me 
         '-', // array[0][1][0] 
         'o', // array[0][1][1] 
         '\0' // array[0][1][2] 
         } 
       }, 
       { // array[1] 
        "-y", "-p", "-q" 
       }, 
       { // array[2] 
        "-r", "-s" 
       } 
       } 
      }; 

如果輸出這個數組,你自然會得到類似的信息(保換非打印「\ 0」以點:

- x . . . . . . . . . . . . . . . . . . // A first 2D array contained in array[0] 
- o . . . . . . . . . . . . . . . . . . // note that each line is exactly 20 chars long 
. . . . . . . . . . . . . . . . . . . . 
(followed by 17 similar empty lines) 
- y . . . . . . . . . . . . . . . . . . // A second 2D array contained in array[1] 
- p . . . . . . . . . . . . . . . . . . 
- q . . . . . . . . . . . . . . . . . . 
(etc) 

Live demo

+0

第二對簡單地對應於數組結構本身,而不考慮維數嗎?我認爲這就是我所拋棄的。通過你的轉換,它顯示了三維的支撐數爲4,我總是想到支撐的數量等於維數。 – user2069339

+0

對於數組初始化,每個維的確有1個大括號,其中包含該維的元素。在這裏,你來到4,因爲在3維的頂部你有結構。 char數組的棘手之處在於它們可以用字符串表示,而不需要額外的大括號。 – Christophe

相關問題