2013-12-21 62 views
0

我現在正在腦海裏結一個關於如何正確初始化GLFloats的一個數組,逐行。 據我所知,一個陣列可以這樣寫:用C++初始化一個GLfloats的多維數組

int a[2][2] = {{1,2},{3,4}} 

在我的情況,我有數組

GLfloat targetVertices[10][72]; 

爲立方體的六個面的頂點(萬個立方,準確地說)。立方座標存儲在

float targetX[10], targetY[10], targetZ[10]; 

數組中。我想初始化它是這樣的:

for(iii = 0; iii <= 9; iii++) { 
    targetVertices[iii] = {     /*Side 1*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1, 
              /*Side 2*/ 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1, 
              /*Side 3*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1, 
              /*Side 4*/ 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1, 
              /*Side 5*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1, 
              /*Side 6*/ 
          targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1, 
          targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1, 
          targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1 
          }; 
} 

不幸的是,我總是告訴關於第一個波浪支架語法錯誤(C2059和C2143,但那些沒有任何意義,我在那裏) 。 我希望我的問題很清楚,有人可以幫助我。我還沒有在這個或任何其他網站上發現任何類似於我的問題。

在此先感謝!

回答

1

你的語法問題是說targetVertices [iii]你指的是數組的iith索引,而不是整列。二維數組存儲爲一維數組,但爲簡單訪問提供[] []。您可以將它們稱爲單維或二維。

這是一個更可重用的方法來解決這個問題。

void addVertex(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z) 
{ 
    data.push_back(x); 
    data.push_back(y); 
    data.push_back(z); 
} 

void addCube(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z) 
{ 
    addVertex(data, x-1, y-1, z-1); 
    addVertex(data, x-1, y-1, z+1); 
    addVertex(data, x-1, y+1, z+1); 
    addVertex(data, x-1, y+1, z-1); 

    addVertex(data, x+1, y-1, z-1); 
    addVertex(data, x+1, y-1, z+1); 
    addVertex(data, x+1, y+1, z+1); 
    addVertex(data, x+1, y+1, z-1); 

    addVertex(data, x-1, y-1, z-1); 
    addVertex(data, x-1, y-1, z+1); 
    addVertex(data, x+1, y-1, z+1); 
    addVertex(data, x+1, y-1, z-1); 

    addVertex(data, x-1, y+1, z-1); 
    addVertex(data, x-1, y+1, z+1); 
    addVertex(data, x+1, y+1, z+1); 
    addVertex(data, x+1, y+1, z-1); 

    addVertex(data, x-1, y-1, z-1); 
    addVertex(data, x-1, y+1, z-1); 
    addVertex(data, x+1, y+1, z-1); 
    addVertex(data, x+1, y-1, z-1); 

    addVertex(data, x-1, y-1, z+1); 
    addVertex(data, x-1, y+1, z+1); 
    addVertex(data, x+1, y+1, z+1); 
    addVertex(data, x+1, y-1, z+1); 
} 

void makeCubes(std::vector<GLfloat> &data) 
{ 
    float targetX[10], targetY[10], targetZ[10]; 
      data.clear(); 
      data.reserve(720); 

    //...initialize the above arrays... 

    for (int i=0; i<10; i++) 
    { 
     std::vector<GLfloat> newData; 
     addCube(newData, targetX[i], targetY[i], targetZ[i]); 
     data.insert(data.begin(), newData.begin(), newData.end()); 
    } 
} 

你可以很容易通過採取參照第一元件將其轉換爲一個C-數組:

std::vector<GLfloat> data; 
makeCubes(data); 
GLfloat *cArray = &data[0]; 

的呼叫到glBufferData c應該是這樣的:

glBufferData(GL_ARRAY_BUFFER, 
      data.size()*sizeof(GLfloat), 
      &data[0], 
      GL_STREAM_DRAW); 
+0

非常感謝,我會嘗試並實施您的解決方案。但是,出於理解的目的,爲什麼我不能簡單地將數據逐行分配給我的數組?它適用於char數組(至少在ANSI-C中)。此外,我可能誤解了,因爲它本身不是一個初始化,而是一個賦值(我預先在兩個嵌套for循環中初始化爲全零)。它可能通過使用「新」關鍵字工作?如在寫GLfloat * targetVertices;在我的頭文件和構造函數中targetVertices = new GLfloat [] [];或者其他的東西? –

+0

您的語法問題是通過說targetVertices [iii]您指的是數組的iiith索引,而不是整列。請參閱2D數組存儲爲1D數組,但爲簡單訪問提供[] []。您可以將它們稱爲單維或二維。如果您已經分配了10x72陣列,則不需要「新」。 –