C - 警告:控制到达非空函数的末尾[-Wreturn-type]

时间:2015-03-26 06:01:10

标签: c

我是C编程的新手。 任何人都可以帮我解释一下我得到的错误。 我不明白为什么我会收到这个错误。

test4.c: In function 'main':
test4.c:65:3: warning: control reaches end of non-void function [-Wreturn-type]

以下是我的代码:

#include <webots/robot.h>
#include <webots/distance_sensor.h>
#include <webots/differential_wheels.h>

#define TIME_STEP 64

int main()
{
   wb_robot_init();
   int i;
   WbDeviceTag ps[8];
   char ps_names[8][4] = {"ps0","ps1","ps2","ps3",
      "ps4","ps5","ps6","ps7"};

   for(i=0;i<8;i++)
   {
      ps[i]=wb_robot_get_device(ps_names[i]);
      wb_distance_sensor_enable(ps[i], TIME_STEP);
   }

   while(1)
   {
      int delay=wb_robot_step(TIME_STEP);
      if(delay==-1)
         break;

      double ps_values[8];
      for(i=0;i<8;i++)
         ps_values[i]=wb_distance_sensor_get_value(ps[i]);
      //printf("ps0=%d\t", ps_values[0]); 

      double left_speed=500;
      double right_speed=500;

      for(;;)
      {

         if(ps_values[0]>80 || ps_values[1]>80 || ps_values[2]>80)
         {
            left_speed =-500;
            right_speed =500;
         }
         else if(ps_values[5]>80 || ps_values[7]>80 || ps_values[2]>80)
         {
            left_speed =500;
            right_speed =-500;
         }
         else
         {
            left_speed =500;
            right_speed =500;
         }

      }
      wb_differential_wheels_set_speed(left_speed, right_speed);
      wb_robot_cleanup();
      return 0;
   }
}

2 个答案:

答案 0 :(得分:1)

您有一个未返回值的非void函数。您的编译器已经分析了可以到达函数的结尾。

if(delay==-1)
    break;

因此,您对遗漏声明的遗漏是可疑或错误的。

在函数末尾添加return 0;或任何合理的值。

主要功能很特别。有效C无效。但即使跳过返回是合法的,编译器也可以给你一个诊断消息(a.k.a。警告)。

您可以尝试使用某种编译指示或命令行参数来说服您的编译器。或者你放弃并返回一个值,即使你认为没必要。这将抑制此警告。 (一种说法并不昂贵。)

答案 1 :(得分:1)

在我看来,return循环结束时的while语句被错误地放在那里。否则,该函数将在循环内执行一轮代码后返回。那么循环的重点是什么?

而不是

   while(1)
   {
      int delay=wb_robot_step(TIME_STEP);
      if(delay==-1)
         break;

      ....
      ....

      wb_differential_wheels_set_speed(left_speed, right_speed);
      wb_robot_cleanup();
      return 0;
   }

也许您打算使用:

   while(1)
   {
      int delay=wb_robot_step(TIME_STEP);
      if(delay==-1)
         break;

      ....
      ....

      wb_differential_wheels_set_speed(left_speed, right_speed);
      wb_robot_cleanup();
   }

   // The return statement outside the while loop.
   return 0;

这也将修复编译器警告。