c - 可变大小的对象可能没有被初始化(但有一个扭曲)C
问题描述
这段代码...
//variables
int tileSize = 20;
int playerSize = 5;
int map[tileSize][tileSize] =
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
...给我这个错误
mateusz@mateusz-MS-7693:~/Desktop/3ds-Projects/Platform_game$ make
main.c
/home/mateusz/Desktop/3ds-Projects/Platform_game/source/main.c: In function 'main':
/home/mateusz/Desktop/3ds-Projects/Platform_game/source/main.c:21:5: error: variable-sized object may not be initialized
21 | int map[tileSize][tileSize] =
| ^~~
make[1]: *** [/opt/devkitpro/devkitARM/base_rules:85: main.o] Error 1
make: *** [Makefile:155: all] Error 2
但是当我在地图变量大小中放入“20”而不是“tileSize”时,如下所示:
//variables
int tileSize = 20;
int playerSize = 5;
int map[20][20] =
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
错误消失,代码编译得很好。
这是完整的代码:
#include <citro2d.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define SCREEN_WIDTH 400
#define SCREEN_HEIGHT 240
int main(int argc, char* argv[]){
gfxInitDefault();
C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
C2D_Init(C2D_DEFAULT_MAX_OBJECTS);
C2D_Prepare();
consoleInit(GFX_BOTTOM, NULL);
C3D_RenderTarget* top = C2D_CreateScreenTarget(GFX_TOP, GFX_LEFT);
//variables
int tileSize = 20;
int playerSize = 5;
int map[20][20] =
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
float Pos[2] = {100,100};
u32 PlayerColor = C2D_Color32(0x10,0x20,0xF0,0xFF);
u32 tileColor = C2D_Color32(0x10,0xF0,0x90,0xFF);
u32 clrClear = C2D_Color32(0x10,0x10,0x10,0xFF);
// Main loop
while (aptMainLoop())
{
hidScanInput();
u32 kDown = hidKeysDown();
if (kDown & KEY_START) break;
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
C2D_TargetClear(top, clrClear);
C2D_SceneBegin(top);
C2D_DrawRectSolid(Pos[0], Pos[1],0,playerSize,playerSize, PlayerColor);
for(int i = 0;i<SCREEN_WIDTH/tileSize;i++){
for(int y = 0;y<SCREEN_HEIGHT/tileSize;y++){
if(map[i][y]){
C2D_DrawRectSolid(i*tileSize, y*tileSize,0,tileSize,tileSize, tileColor);
}
}
}
C3D_FrameEnd(0);
}
gfxExit();
C2D_Fini();
C3D_Fini();
return 0;
}
为什么我不能将“tileSize”变量放在地图大小内?
解决方案
tileSize
不是编译时常量值。它是一个运行时变量,其值在编译时未知。
在 C 中,如果您希望能够在定义时初始化数组,则需要将编译时常量作为数组大小。
最常见的方法是使用宏:
#define TILE_SIZE 20
int map[TILE_SIZE][TILE_SIZE] = { ... };
另一种可能性是使用枚举:
enum
{
tileSize = 20
};
int map[tileSize][tileSize] = { ... };
推荐阅读
- python-3.x - 我们如何在 Jupyter-Notebook (Anaconda) 中从 firebase 检索实时数据库到 Python3
- angular - How to initialize Full Calendar version 4 in Angular
- json - Python Error in extracting data from nested json
- java - IBM MQ 使用用户名/密码列出队列
- android - 如果行数超过一个,如何在 Android 的 TextView 中的特定单词之前插入换行符?
- django - gunicorn:错误:参数--error-logfile/--log-file:预期一个参数
- google-maps - 在页面加载时打开 Google Maps API 信息窗口
- html - How to hide Button if Job is successfully executed in angular 7
- java - Reading and interpreting a logical expression in a program
- node.js - Get the version number of an installed Node package without loading it?