2014-02-28 10 views
0
float verticies[14][3]; 

init_mod(){ 

verticies = {{-0.5,-0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5, 0.5, 0.5}, 
    { 0.5, 0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    { 0.5, 0.5,-0.5}, 
    {-0.5,-0.5,-0.5}, 
    { 0.5,-0.5,-0.5}, 
    { 0.5, 0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5,-0.5,-0.5}, 
    {-0.5,-0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    {-0.5, 0.5, 0.5}}; 
} 

初始化在C全球二維數組,當我編譯程序我得到這個錯誤:從功能

topsecret.c: In function ‘init_mod’: 
topsecret.c:12:14: error: expected expression before ‘{’ token 
+1

你得到了這個錯誤,因爲你不能指定這樣的值,你必須做它的元素。你唯一可以做到這一點的是,如果你在聲明它時初始化變量。 – Mike

+0

你在調用函數還是試圖定義它? – ArthurChamz

回答

4

您使用僅允許用於初始化的語法;它不允許分配。

它移動到你的全局數組的聲明將解決這個問題:如果你需要在一段時間後,你可以初始化一個臨時的「模板」陣內陣重新分配

float verticies[14][3] = 
    {{-0.5,-0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5, 0.5, 0.5}, 
    { 0.5, 0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    { 0.5, 0.5,-0.5}, 
    {-0.5,-0.5,-0.5}, 
    { 0.5,-0.5,-0.5}, 
    { 0.5, 0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5,-0.5,-0.5}, 
    {-0.5,-0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    {-0.5, 0.5, 0.5}}; 

您函數,然後使用memcpy將其內容放入全局數組中。

0

由於它是二維陣列,所以應該像這樣聲明data_type array_name [][];請注意,您將不得不爲最後的[]支架傳遞一些值。即'float vertices [] [3] = _;

init_mod() 
{ 

    verticies [][3] = {{-0.5,-0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5, 0.5, 0.5}, 
    { 0.5, 0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    { 0.5, 0.5,-0.5}, 
    {-0.5,-0.5,-0.5}, 
    { 0.5,-0.5,-0.5}, 
    { 0.5, 0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5,-0.5,-0.5}, 
    {-0.5,-0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    {-0.5, 0.5, 0.5}}; 
} 
0

您不能直接分配數組,因此創建數組複合文字沒有幫助。但是,結構中的數組可以通過複合文字分配。因此,你可以考慮使用:

struct FloatArray 
{ 
    float verticies[14][3]; 
}; 

struct FloatArray vertices; 

float (*verticies)[3] = vertices.verticies; 

extern void init_mod(void); 

void init_mod(void) 
{ 
    vertices = (struct FloatArray){ 
     .verticies = 
     { 
      {-0.5,-0.5, 0.5}, 
      { 0.5,-0.5, 0.5}, 
      {-0.5, 0.5, 0.5}, 
      { 0.5, 0.5, 0.5}, 
      {-0.5, 0.5,-0.5}, 
      { 0.5, 0.5,-0.5}, 
      {-0.5,-0.5,-0.5}, 
      { 0.5,-0.5,-0.5}, 
      { 0.5, 0.5, 0.5}, 
      { 0.5,-0.5, 0.5}, 
      {-0.5,-0.5,-0.5}, 
      {-0.5,-0.5, 0.5}, 
      {-0.5, 0.5,-0.5}, 
      {-0.5, 0.5, 0.5}, 
     } 
    }; 
} 

該代碼利用你的vertices拼寫錯誤,並讓你的現有代碼不變,儘管全球verticies的類型已經改變的指針數組。函數內部的代碼使用複合文字來初始化結構,它具有初始化指針所指向的數組的(有益的)副作用。

此代碼GCC 4.8.2下完全編譯在Mac OS X 10.9.2小牛用命令行:

gcc -g -O3 -std=c99 -Wall -Wextra -Werror -c crazy.c 

我假設初始化功能是需要前到陣列重置到已知狀態一些使用和修改數組的代碼的下一次迭代的開始。如果你只需要在程序啓動時初始化一次數組,那麼你用一個簡單的數組初始值設定項來做不同的事情。但似乎你可能已經知道這一點。

而這段代碼演示了等價性。數組old_vertices對應於您對verticies的定義,但被初始化(一次)。

#include <stdio.h> 

float old_vertices[14][3] = 
{ 
    {-0.5,-0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5, 0.5, 0.5}, 
    { 0.5, 0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    { 0.5, 0.5,-0.5}, 
    {-0.5,-0.5,-0.5}, 
    { 0.5,-0.5,-0.5}, 
    { 0.5, 0.5, 0.5}, 
    { 0.5,-0.5, 0.5}, 
    {-0.5,-0.5,-0.5}, 
    {-0.5,-0.5, 0.5}, 
    {-0.5, 0.5,-0.5}, 
    {-0.5, 0.5, 0.5}, 
}; 

struct FloatArray 
{ 
    float verticies[14][3]; 
}; 

struct FloatArray vertices; 

float (*verticies)[3] = vertices.verticies; 

extern void init_mod(void); 

void init_mod(void) 
{ 
    vertices = (struct FloatArray){ 
     .verticies = 
     { 
      {-0.5,-0.5, 0.5}, 
      { 0.5,-0.5, 0.5}, 
      {-0.5, 0.5, 0.5}, 
      { 0.5, 0.5, 0.5}, 
      {-0.5, 0.5,-0.5}, 
      { 0.5, 0.5,-0.5}, 
      {-0.5,-0.5,-0.5}, 
      { 0.5,-0.5,-0.5}, 
      { 0.5, 0.5, 0.5}, 
      { 0.5,-0.5, 0.5}, 
      {-0.5,-0.5,-0.5}, 
      {-0.5,-0.5, 0.5}, 
      {-0.5, 0.5,-0.5}, 
      {-0.5, 0.5, 0.5}, 
     } 
    }; 
} 

int main(void) 
{ 
    init_mod(); 

    double old_sum = 0.0; 
    double sum = 0.0; 
    for (int i = 0; i < 14; i++) 
    { 
     for (int j = 0; j < 3; j++) 
     { 
      old_vertices[i][j] *= (i * 14 + j); 
      old_sum += old_vertices[i][j]; 
      verticies[i][j] *= (i * 14 + j); 
      sum += verticies[i][j]; 
     } 
    } 
    printf("%f == %f\n", old_sum, sum); 

    return 0; 
}