1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】警告:制御が非ボイド関数の終わりに達する [-Wreturn-type].

2022-01-02 06:06:41

質問

機能に関して少し疑問があります。私が使っていないせいだと思うのですが。私のコードは以下の通りです。

/*date difference calculator*/

#include <stdio.h>

int main()
{
  int Date1 = 0, Date2 = 0, Dif, F, L, D1, D2, M1, M2, Y1, Y2;
  int x[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  int y[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  char A1, A2, B1, B2;

/*input first date*/

 fprintf (stderr , "Enter first date,in the form <day>/<month>/<year>  or <day>-<month>-<year>.\nWhere <day>,<month> and <year> are integers:\n");
 (scanf("%i%c%i%c%i", &D1, &A1, &M1, &B1, &Y1));

/*check first date*/

 if (!(Y1 % 4)) x[2]=29;
 while ((Y1 < 1 || (Y1 > 9999)) || (M1 < 1 || M1 > 12) || (D1 < 1 || D1 > x[M1]) || (A1 != B1) || ((A1 != '/') && (A1 != '-'))) 
     {
       fprintf (stderr, "Incorrect format, re-enter date:\n");
       scanf("%i%c%i%c%i", &D1, &A1, &M1, &B1, &Y1);
       if (!(Y1 % 4)) x[2]=29;
     }

/*print first date*/

 fprintf (stderr, "First date = %i%c%i%c%i\n", D1 , A1 , M1 , B1 , Y1);

/*input second date*/

 fprintf (stderr , "Enter second date,in the form <day>/<month>/<year> or <day>-<month>-<year>.\nWhere <day>,<month> and <year> are integers:\n");
 (scanf("%i%c%i%c%i", &D2, &A2, &M2, &B2, &Y2));

/*check second date*/

 if (!(Y2 % 4)) y[2]=29;
 while ((Y2 < 1 || (Y2 > 9999)) || (M2 < 1 || M2 > 12) || (D2 < 1 || D2 > y[M2]) || (A2 != B2) || ((A2 != '/') && (A2 != '-'))) 
     {
       fprintf (stderr, "Incorrect format, re-enter date:\n");
       scanf("%i%c%i%c%i", &D2, &A2, &M2, &B2, &Y2);
       if (!(Y2 % 4)) y[2]=29;
     }

/*print second date*/

 fprintf (stderr, "Second date = %i%c%i%c%i\n", D2 , A2 , M2 , B2 , Y2);

/*convert first date into days*/

 for (F = 1; Y1 > F ; F++) 
    {
     if (F % 4 == 0) (Date1 = Date1 + 366);
     else (Date1 = Date1 + 365);
    }
 for (L = 1; M1 > L ; L++) 
     Date1 = Date1 + x[L];
 Date1 = Date1 + D1;

/*convert second date into days*/

 for (F = 1; Y2 > F ; F++) 
    {
     if (F % 4 == 0) (Date2 = Date2 + 366);
     else (Date2 = Date2 + 365);
    }
 for (L = 1; M2 > L ; L++) 
     Date2 = Date2 + y[L];
 Date2 = Date2 + D2;

/*standard output*/

 Dif = Date2 - Date1;
 printf("\n%i\n\n" , Dif);

/*text output*/

 if (Date2 > Date1)  
    {Dif = Date2 - Date1;
    fprintf (stderr , "Indicating that the first date is %i days before second date.\n" , Dif);}
 if (Date1 > Date2)  
    {Dif = Date1 - Date2;
    fprintf (stderr , "Indicating that the second date is %i days before first date.\n" , Dif);} 
 if (Date1 == Date2)  
    fprintf (stderr , "Indicating that the first date is equal to second date.\n"); 
}

これを用いてコンパイルする場合。 gcc -Wall -ansi date1.c -o date1 このような現象が発生します。

date1.c: In function ‘main’:
date1.c:70:1: warning: control reaches end of non-void function [-Wreturn-type]

それとも、関数を使うようにプログラムを書かなければならないのでしょうか?コンパイルは決められた仕様に従わなければならないので、コンパイル方法を変更することはできません。

質問の形式が悪くて申し訳ないのですが、初めてここに来たので、一人でできるようになりたいと思っていました。

誰か助けてくれるといいんだけどな〜。

解決方法は?

必要なのは return をある時点でmain関数から削除してください。エラーメッセージによると、この関数は値を返すように定義されていますが、あなたは何も返していません。

  /* .... */
  if (Date1 == Date2)  
     fprintf (stderr , "Indicating that the first date is equal to second date.\n"); 

  return 0;
}