2009-08-29 49 views
0

我很久没用过C了。这里发生了什么?GCC结构编译器怪异数组

 

wOCR.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token 
wOCR.c:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token 

on this code: 

struct wOCR_matchGrid { 
    char character; 
    int * data; 
}; 

struct wOCR_matchGrid alphaMatch[26]; 

alphaMatch[0].character = 'A'; /*8*/ 
alphaMatch[0].data = {   /*9*/ 
        0, 1, 0, 
        1, 0, 1, 
        1, 1, 1, 
        1, 0, 1 
        }; 
+2

你不能在函数之外放置任意C代码。 – 2009-08-29 18:30:49

回答

1

你应该在函数体内部做这些赋值。

+0

DUH !!!! thnx lotz。我的C – woxorz 2009-08-29 18:36:51

0

你可以像这样做,但它是凌乱如地狱:

struct wOCR_matchGrid { 
    char character; 
    int data[12]; 
}; 

struct wOCR_matchGrid alphaMatch[26] = 
{ 
    {'A', {0, 1, 0, 
      1, 0, 1, 
      1, 1, 1, 
      1, 0, 1}}, 
    {'B', {0, 1, 0, 
      1, 0, 1, 
      1, 1, 1, 
      1, 0, 1}}, 
    /* etc */ 
}; 

注意,数据不能随意在这种情况下,大小。

3

首先,你应该在一个函数体内进行。然后,使用大括号的语法是非法的,因为您将它们分配给指针,而不是数组或结构。该语法也仅在初始化时有效,而不是在赋值期间有效。

的代码可能使用复合文字,和一些程序员除去必要的类型名称:

void some_function(void) { 
    struct wOCR_matchGrid alphaMatch[26]; 

    alphaMatch[0].character = 'A'; /*8*/ 
    alphaMatch[0].data = (int[]){   /*9*/ 
         0, 1, 0, 
         1, 0, 1, 
         1, 1, 1, 
         1, 0, 1 
         }; 

}; 

注意括号int[]我添加。这将告诉GCC在该函数调用的整个生命周期内创建一个未命名的数组,并将其地址分配给指针.data。在这种情况下,这是而不是,但这对于此语法工作并创建数组复合文字至关重要。但是,这些复合文字是C99功能,并不适用于每个编译器。

+0

已经很硬了,当然,复合文字不适用于所有的编译器(特别是不适用于MSVC!),但它们在GCC中工作,除非您告诉它不要使用“-std = c89”或某些类似的选项。 – 2009-08-29 19:17:47