我有一个问题。 我已将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]={
^
此代码摘录有什么问题
答案 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;
}