2016-03-14 50 views
-1
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); 
    } 

请问您能帮我解决这个问题吗?提前致谢。可能未初始化的本地指针变量'playtimer'used

以上是我的代码显示。错误和警告都低于:

警告C4101: 'STR':未引用的局部变量 -

警告C4715: 'SDL_main':不是所有的控制路径返回一个值 -

错误C4703:潜在的未初始化本地指针变量 “playtimer”使用

+0

请学习格式化代码。对于任何人来看代码非常重要。另外,我还没有纠正像缺少main的右括号这样的语法错误。 – Mahesh

+1

对不起,因为这是我的第一个问题。 – asdfg

+0

“mode”声明在哪里? – AnT

回答

2

初始化playtimer唯一的地方是在

if (mode == PLAY) 
    playtimer = SDL_AddTimer(1000/16, timer_proc, NULL); 

这1A中有条件的初始化和指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做同样的事情。

+2

此外,我没有看到'main'内的'mode'声明。这可能意味着'mode'在命名空间范围内被声明为外部。在这些情况下,从编译器的角度来看,任何中间调用(如'EventLoop(fp)')都可能改变'mode'。如果'mode'是本地编译器最可能不会发出该警告。这足够聪明。 – AnT