
解決したいこと
下記に示すコードをコンパイルしたところ、「発生している問題・エラーメッセージ」に示すように、"running_fifo"で型が対立している、となりエラーになってしまいます。仮引数と実引数の型は合わせているし、関数の本体と宣言の型も合わせているにも関わらず、なぜエラーになってしまうかが分かりません。どなたか分かる方、ご教授のほどよろしくお願いいたします。
発生している問題・エラーメッセージ
puls_blanking_FIFO.c:63:7: error: conflicting types for ‘running_fifo’ 63 | float running_fifo(float newdata, float array_fifo[]) | ^~~~~~~~~~~~ puls_blanking_FIFO.c:64:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration 64 | { | ^ puls_blanking_FIFO.c:9:8: note: previous declaration of ‘running_fifo’ was here 9 | float running_fifo(); | ^~~~~~~~~~~~
該当のソースコード
puls_blanking_FIFO.c
1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4 5#define N_FIFO 1024 6#define Nwait 700 7#define Nblank 100 8 9float running_fifo(); 10 11int main(int argc,const char *argv[]) 12{ 13 int i; 14 15 float ar, ai; 16 17 float array_fifo[N_FIFO] = {0}; 18 19 float newdata, lastdata; 20 float sum; 21 22 FILE *fp; 23 24 if(argc != 2) 25 { 26 printf("Usage: ./fft2 <No.1 input file name> <number of frames>\n"); 27 exit(1); 28 } 29 30 fp = fopen(argv[1],"r"); 31 32 sum = 0.0; 33 34 while(1) 35 { 36 if(feof(fp) != 0) 37 break; 38 else { 39 40 fread(&ar, sizeof(float), 1, fp); 41 fread(&ai, sizeof(float), 1, fp); 42 newdata = ar + ai; 43 44 for(i = 0; i < N_FIFO; i++) 45 sum += newdata; 46 47 printf("%lf\n", sum); 48 49 lastdata = running_fifo(newdata, array_fifo); 50 51 } 52 } 53 54 return 0; 55} 56 57float running_fifo(float newdata, float array_fifo[]) 58{ 59 int i, j; 60 float lastdata; 61 62 lastdata = array_fifo[N_FIFO-1]; 63 64 for(i = 1; i < N_FIFO; i++) 65 { 66 j = N_FIFO - i; 67 array_fifo[j] = array_fifo[j - 1]; 68 } 69 70 array_fifo[0] = newdata; 71 72 return lastdata; 73}

エラーを素直に読むだけで分かると思うのですが、9行目のプロトタイプ宣言の引数の型がおかしくないですか?
ソースコード9行目のプロトタイプ宣言と
ソースコード57行目の実装、及び49行目の呼び出しが異なるからじゃないですかね。
dameo様、setoppu様、ご回答いただき、ありがとうございます。
なるほど、そこだったんですね。他のコードでも関数の本体と宣言を同じ形で書いてあるのですが、コンパイルも実行も問題なく実行できていたので、今回のコードでなぜエラーが出ているのか分からなかったです。

プロトタイプ宣言は実際の呼び出されるコード(今回だと49行目)で使用されます。引数を入れて呼び出しているのに、宣言では何も引数がないので不一致とエラーになっています。
関数の実装については、C言語だと既定では名前以外(シグニチャ)の一致は確認されないので、違っていてもエラーになりません。
gccだと-Wstrict-prototypesオプションを付けてコンパイルするとワーニングが出ます。
なるほど、そうだったんですね。ありがとうございます。前にプロトタイプ宣言について調べたところ、今回のような引数なしの宣言でも良いという記事を見つけ、試したところ問題なく動いたので、大丈夫と思って今回も引数なしで宣言していました。次からは宣言にもちゃんと引数を書くように気を付けます。

回答3件
あなたの回答
tips
プレビュー