我正在尝试使用SDL在C中制作一个小程序,显示一个在网格上移动的机器人。此网格由ts文件0s和1s表示。
这是从txt文件创建数组的功能,它可以工作。
// create a map(array) from a text file
int (*newMap())[SIZE_HEIGHT][SIZE_WIDTH]
{
static const char filename[] = "input.txt"; /* the name of a file to open */
FILE *file = fopen(filename, "r"); /* try to open the file */
int map[SIZE_HEIGHT][SIZE_WIDTH];
char line[BUFSIZ]; /* space to read a line into */
int k = 0;
while ( fgets(line, sizeof line, file)!=NULL && k<SIZE_HEIGHT) /* read each line */
{
int i;
char *token = line; /* point to the beginning of the line */
for ( i = 0; i<SIZE_WIDTH; i++ )
{
map[k][i]=((int)*token)-48;
token+=sizeof(char);
printf("map[%d][%d]=%d\n", (int)k,(int)i,map[k][i]);
}
puts("----\n");
k++;
}
fclose(file);
int (*p)[SIZE_HEIGHT][SIZE_WIDTH];
p=↦
return p;
}
然后我尝试将网格放在屏幕上(不是整个功能):
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <time.h>
#include <string.h>
#include "Parameters.h"
#include "simulation.h"
#include "editor.h"
void simulate(SDL_Surface *ecran)
{
SDL_Surface *carreVert = SDL_LoadBMP("carreVert.bmp");
SDL_Surface *carreRouge = SDL_LoadBMP("carreRouge.bmp");
SDL_Surface *robot = SDL_LoadBMP("robotRouge.bmp");
SDL_SetColorKey(robot, SDL_SRCCOLORKEY, SDL_MapRGB(robot->format, 255, 255, 255));
int (*map)[SIZE_HEIGHT][SIZE_WIDTH];
map=newMap();
SDL_Rect positionFond;
int i;
int j;
for(j=0; j<SIZE_HEIGHT; j++)
{
for(i=0; i<SIZE_WIDTH; i++)
{
positionFond.x = 100*i;
positionFond.y = 100*j;
if((*map)[j][i]+1)
{
SDL_BlitSurface(carreVert, NULL, ecran, &positionFond);
}else
{
SDL_BlitSurface(carreRouge, NULL, ecran, &positionFond);
}
}
}
然后发生了一些奇怪的事情:当我用调试器观察数组*映射时,我发现当我进行测试时值会发生变化。所以网格确实出现了,但没有正确的模式。为什么会这样?
编辑:编译器没有错误。
编辑:任何可以做到这一点的猜测都会很乐意接受。
答案 0 :(得分:2)
数组map
是函数的本地。当函数完成时它就不复存在了。您将其地址传递给调用者,但是当调用者尝试使用它时... BANG!
快速解决方案:将数组map
设为static
一个:确保每次运行时不要多次调用newMap
。
其他解决方案:
malloc
和朋友来管理数组答案 1 :(得分:1)
您正在返回一个指向具有自动存储持续时间的对象的指针(一个从声明它的函数返回时被“解除分配”的数组),因此您最终会看到随机垃圾。