int main(int argc, char* argv[])
{
char str[256];
FILE *fp = NULL;
int h[3];
SDL_TimerID playtimer, fpstimer;
if (!init())
return 1;
if (argc>1) {
if (!strcmp(argv[1],"-l") && (argc==3)) {
mode = PLAY;
if (!viewer->open(argv[2])) {
error("Unable to load data file\n");
exit(1);
}
} else if (!strcmp(argv[1], "-w") && (argc==3)) {
mode = SIMULATE;
fp = fopen(argv[2], "wb");
fwrite(h, sizeof(int), 3, fp);
} else {
printf("Invalid command line argument. Usage: fluid [-l|-w <filename>]\n");
exit(1);
}
} else {
mode = SIMULATE;
}
if (mode == SIMULATE)
simthread = SDL_CreateThread(simulate, NULL);
if (mode == PLAY)
playtimer = SDL_AddTimer(1000/16, timer_proc, NULL);
fpstimer = SDL_AddTimer(1000, showfps, NULL);
EventLoop(fp);
SDL_RemoveTimer(fpstimer);
if (mode==PLAY)
SDL_RemoveTimer(playtimer);
if (mode == SIMULATE) {
quitting = true;
SDL_WaitThread(simthread, NULL);
}
if (fp && (mode == SIMULATE)) {
int pos;
h[0] = h[1] = N+2;
h[2] = simframes;
pos = ftell(fp);
fseek(fp, 0, SEEK_SET);
fwrite(h, sizeof(int), 3, fp);
fclose(fp);
printf("%d frames written to file %s, %d kiB\n", simframes, argv[2], pos>>10);
}
你可以帮我解决这个问题吗?提前谢谢。
以上是我的代码。错误和警告如下:
警告C4101:&#39; str&#39; :未引用的局部变量 -
警告C4715:&#39; SDL_main&#39; :并非所有控制路径都返回值 -
错误C4703:可能未初始化的本地指针变量 &#39; playtimer&#39;使用
答案 0 :(得分:2)
您初始化playtimer
的唯一位置是
if (mode == PLAY)
playtimer = SDL_AddTimer(1000/16, timer_proc, NULL);
这是一个条件初始化,意味着playtimer
可能会或可能不会在以下代码中初始化。那你有
if (mode==PLAY)
SDL_RemoveTimer(playtimer);
因此,如果您到达SDL_RemoveTimer(playtimer);
playtimer
,可能会因为第一个if语句而初始化。现在我们可以推断,因为如果条件具有相同的条件,那么必须初始化playtimer
并且我们没问题。不幸的是,试图让编译器看到这是非常困难的,并且很可能是编译器供应商选择不实现的东西。此外,如果这是一个多线程程序mode
可能会在两个if语句之间发生变化,并且编译器将无法对其进行分析。
我建议你将两个语句组合成一个if块,以保证playtimer
在使用时被初始化:
if (mode == PLAY)
{
playtimer = SDL_AddTimer(1000/16, timer_proc, NULL);
SDL_RemoveTimer(playtimer);
}
我还建议你对simthread
做同样的事情。