switch语句中的char数组,带有奇怪的错误信息

时间:2014-10-08 18:29:28

标签: c

我有一个问题。 我已将char声明为数组,并且根据其他参数,此数组必须看起来不同。

char map[10][10];
switch(stage){
case 1:
//Map NR1
map [10][10]={
    {'#','#','#','#','#','#','#','#','#','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#',' ','&',' ','#',' ',' ','#'},
    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#','#','#','#','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#','S','T','A','G','E','1',' ',' ','#'},      
    {'#','#','#','#','#','#','#','#','#','#'} };
    break;
case 2:
//Map NR2
map [10][10]={
    {'#','#','#','#','#','#','#','#','#','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','&',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#','#','#','#','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#','S','T','A','G','E','2',' ',' ','#'},
    {'#','#','#','#','#','#','#','#','#','#'}, };
    break;
    }

现在是我的问题:为什么我会这样做?:

main.c: In function 'map_initialisation':
main.c:32:15: error: expected expression before '{' token
  map [10][10]={
               ^
main.c:46:15: error: expected expression before '{' token
  map [10][10]={
               ^

此代码摘录有什么问题

4 个答案:

答案 0 :(得分:3)

首次声明地图时,您只能使用特殊的初始化语法,而不是稍后使用。尝试这样的事情:

char map1[10][10]={
    {'#','#','#','#','#','#','#','#','#','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#',' ','&',' ','#',' ',' ','#'},
    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#','#','#','#','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#','S','T','A','G','E','1',' ',' ','#'},      
    {'#','#','#','#','#','#','#','#','#','#'} };

char map2[10][10]={
    {'#','#','#','#','#','#','#','#','#','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','&',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#','#','#','#','#',' ',' ','#'},
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#','S','T','A','G','E','2',' ',' ','#'},
    {'#','#','#','#','#','#','#','#','#','#'}, };

char (*current_level)[10];

switch(stage)
{
    case 1:
        current_level = map1;
        break;

    case 2:
        current_level = map2;
        break;
}

编辑:修正了轻微的输入问题

答案 1 :(得分:2)

正如其他人所说,你不能分配给数组。

我建议您稍微更改一下数据结构:

char maps[][10][10] = {
    {
        "##########",
        "#        #",
        "#     #  #",
        "#     #  #",
        "# # & #  #",
        "# #   #  #",
        "# #####  #",
        "#        #",
        "#STAGE1  #",
        "##########"
    },
    {
        "##########",
        "#        #",
        "#     #  #",
        "#     #  #",
        "# &   #  #",
        "# #   #  #",
        "# #####  #",
        "#        #",
        "#STAGE2  #",
        "##########"
    }
};
size_t nmaps = sizeof maps / sizeof maps[0];

然后,你可以这样做:

char (*map)[10];
if (stage > 0 and stage <= nmaps) {
    map = maps[stage - 1];
} else {
    /* handle error */
}

如果您希望单个值为字符串(以空值终止),则至少需要11个字符。因此,您必须将maps声明为char maps[][10][11] = ...,并将map声明更改为char (*map)[11];

答案 2 :(得分:0)

你可以这样做只宣告一次地图,即使这是非常糟糕的做法。我重申这不会很好,但会奏效。 Goto仇恨远离:

    int flag;
    switch(stage){
    case 1:
    //Map NR1
       goto first;
    case 2:
    //Map NR2
       goto second;
    }

first:
 char map [10][10]={
        {'#','#','#','#','#','#','#','#','#','#'},
        {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
        {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
        {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
        {'#',' ','#',' ','&',' ','#',' ',' ','#'},
        {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
        {'#',' ','#','#','#','#','#',' ',' ','#'},
        {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
        {'#','S','T','A','G','E','1',' ',' ','#'},      
        {'#','#','#','#','#','#','#','#','#','#'} };
  flag = 0;

if(flag != 0)
  goto third;
  second:
        char map [10][10]={
        {'#','#','#','#','#','#','#','#','#','#'},
        {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
        {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
        {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
        {'#',' ','&',' ',' ',' ','#',' ',' ','#'},
        {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
        {'#',' ','#','#','#','#','#',' ',' ','#'},
        {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
        {'#','S','T','A','G','E','2',' ',' ','#'},
        {'#','#','#','#','#','#','#','#','#','#'} };

   third: return 0;

答案 3 :(得分:0)

您的代码存在问题,即没有接受初始化列表的数组特定的赋值运算符。但是有结构的赋值运算符。

如果您的编译器支持C99,那么您可以通过复合文字使用以下方法并将数组包装在结构中。

#include <stdio.h>

struct MAP
{
    char map[10][10];
};

int main()
{
    struct MAP map; 
    int stage = 1;

    switch ( stage )
    {
        case 1:
            map =
            ( struct MAP ){
                {
                    {'#','#','#','#','#','#','#','#','#','#'},
                    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
                    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
                    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
                    {'#',' ','#',' ','&',' ','#',' ',' ','#'},
                    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
                    {'#',' ','#','#','#','#','#',' ',' ','#'},
                    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
                    {'#','S','T','A','G','E','1',' ',' ','#'},      
                    {'#','#','#','#','#','#','#','#','#','#'}
                }
            };
            break;

        case 2:
            map = 
            ( struct MAP ){
                {
                    {'#','#','#','#','#','#','#','#','#','#'},
                    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
                    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
                    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
                    {'#',' ','&',' ',' ',' ','#',' ',' ','#'},
                    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
                    {'#',' ','#','#','#','#','#',' ',' ','#'},
                    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
                    {'#','S','T','A','G','E','2',' ',' ','#'},
                    {'#','#','#','#','#','#','#','#','#','#'}, 
                }
            };
            break;
    }

    for ( int i = 0; i < 10; i++ )
    {
        for ( int j = 0; j < 10; j++ ) printf( "%c", map.map[i][j] );
        puts( "" );
    }

    return 0;
}

输出

##########
#        #
#     #  #
#     #  #
# # & #  #
# #   #  #
# #####  #
#        #
#STAGE1  #
##########

您可以通过引入宏来使代码更具可读性

#include <stdio.h>

struct MAP
{
    char map[10][10];
};

#define STAGE1 \
{\
    {'#','#','#','#','#','#','#','#','#','#'},\
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},\
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},\
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},\
    {'#',' ','#',' ','&',' ','#',' ',' ','#'},\
    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},\
    {'#',' ','#','#','#','#','#',' ',' ','#'},\
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},\
    {'#','S','T','A','G','E','1',' ',' ','#'},\
    {'#','#','#','#','#','#','#','#','#','#'}\
}

#define STAGE2 \
{\
    {'#','#','#','#','#','#','#','#','#','#'},\
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},\
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},\
    {'#',' ',' ',' ',' ',' ','#',' ',' ','#'},\
    {'#',' ','&',' ',' ',' ','#',' ',' ','#'},\
    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},\
    {'#',' ','#','#','#','#','#',' ',' ','#'},\
    {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},\
    {'#','S','T','A','G','E','2',' ',' ','#'},\
    {'#','#','#','#','#','#','#','#','#','#'},\
}

int main()
{
    struct MAP map; 
    int stage = 1;

    switch ( stage )
    {
        case 1:
            map = ( struct MAP ){ STAGE1 };
            break;

        case 2:
            map = ( struct MAP ){ STAGE2 };
            break;
    }

    for ( int i = 0; i < 10; i++ )
    {
        for ( int j = 0; j < 10; j++ ) printf( "%c", map.map[i][j] );
        puts( "" );
    }

    return 0;
}