c - 使用内联不同维度匿名数组初始化多维指针



我遇到了菜鸟问题。我正在用c制作俄罗斯方块。我想为每个实例初始化内联结构中的双指针。数组的宽度不同,但它是在另一个变量中定义的。法典:

typedef struct {
    char height, width;
    char **shape;
} Shape;
const Shape S_shape = {2,3, (char [][3]){{0,1,1},{1,1,0}}};
const Shape Z_shape = {2,3, (char [][3]){{1,1,0},{0,1,1}}};
const Shape T_shape = {2,3, (char [][3]){{0,1,0},{1,1,1}}};
const Shape L_shape = {2,3, (char [][3]){{0,0,1},{1,1,1}}};
const Shape ML_shape = {2,3, (char [][3]){{1,0,0},{1,1,1}}};
const Shape SQ_shape = {2,2, (char [][2]){{1,1},{1,1}}};
const Shape R_shape = {1,4, (char [][4]){{1,1,1,1}}};
int main() {
    return 0;
}

它不起作用。这是 gcc 错误代码:

    tetris.c:11:1: warning: initialization from incompatible pointer type [enabled by default]
 const Shape S_shape = {2,3, (char [][3]){{0,1,1},{1,1,0}}};
 ^
tetris.c:11:1: warning: (near initialization for ‘S_shape.shape’) [enabled by default]
tetris.c:12:1: warning: initialization from incompatible pointer type [enabled by default]
 const Shape Z_shape = {2,3, (char [][3]){{1,1,0},{0,1,1}}};
 ^
tetris.c:12:1: warning: (near initialization for ‘Z_shape.shape’) [enabled by default]
tetris.c:13:1: warning: initialization from incompatible pointer type [enabled by default]
 const Shape T_shape = {2,3, (char [][3]){{0,1,0},{1,1,1}}};
 ^
tetris.c:13:1: warning: (near initialization for ‘T_shape.shape’) [enabled by default]
tetris.c:14:1: warning: initialization from incompatible pointer type [enabled by default]
 const Shape L_shape = {2,3, (char [][3]){{0,0,1},{1,1,1}}};
 ^
tetris.c:14:1: warning: (near initialization for ‘L_shape.shape’) [enabled by default]
tetris.c:15:1: warning: initialization from incompatible pointer type [enabled by default]
 const Shape ML_shape = {2,3, (char [][3]){{1,0,0},{1,1,1}}};
 ^
tetris.c:15:1: warning: (near initialization for ‘ML_shape.shape’) [enabled by default]
tetris.c:16:1: warning: initialization from incompatible pointer type [enabled by default]
 const Shape SQ_shape = {2,2, (char [][2]){{1,1},{1,1}}};
 ^
tetris.c:16:1: warning: (near initialization for ‘SQ_shape.shape’) [enabled by default]
tetris.c:17:1: warning: initialization from incompatible pointer type [enabled by default]
 const Shape R_shape = {1,4, (char [][4]){{1,1,1,1}}};
 ^
tetris.c:17:1: warning: (near initialization for ‘R_shape.shape’) [enabled by default]

GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4谢谢!

解决https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html

您缺少一些compound literals,并且在正在使用的类型中使用了错误的类型。下面是您可能想要的一个小示例:

const Shape S_shape = {
        2, /* height */
        2, /* width */
        (char *[]) { /* Compound literals, declaring an anonymous array of `char *` with static storage duration */
                (char []) {0, 1}, /* Another compound literal, declaring a static storage duration for a `char []` that will be pointed by `char *[]` */
                (char []) {1, 1} /* Same as above, this one the next (and last) element of `char *[]` */
        }
};

没有注释(为了可读性):

const Shape S_shape = {
        2,
        2,
        (char *[]) {
                (char []) {0, 1},
                (char []) {1, 1}
        }
};

https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html

相关内容

  • 没有找到相关文章

最新更新