ページ 1 / 1
仮引数の省略でエラー
Posted: 2014年9月02日(火) 16:34
by ジェリナゲ
授業で仮引数は省略しても構わないと習ったので次の様に省略したら
error: conflicting types for ‘fill’
void fill(int vc[],int no,int x){
^
note: previous declaration of ‘fill’ was here
void fill(int,int,int);
^
というようにエラーが出ました。
仮引数をしっかりと書いた場合はコンパイルが通りました。
どういうことでしょうか。
コード:
#include <stdio.h>
#define NUMBER 5
void fill(int,int,int);
int main(void){
int vc[NUMBER];
int i;
fill(vc,NUMBER,2);
for(i=0;i<NUMBER;i++){
printf("vc[%d]=%d",i,vc[i]);
}
return 0;
}
void fill(int vc[],int no,int x){
while(no-->0){
vc[no]=x;
}
}
Re: 仮引数の省略でエラー
Posted: 2014年9月02日(火) 17:24
by usao
エラーメッセージの通りだと思いますが.
C言語(ですよね?)では,同じ名前の関数を,別の型で複数作れないよ,ということです.
void fill(int,int,int);
の部分で,
「fillという名前の関数は
戻り値がvoid
引数が int, int, int
です」
と宣言したわけですが,
その次には
void fill(int vc[],int no,int x){ ... }
として
fillという同名関数を,第一引数の型が異なる関数として定義しようとしているから怒られているわけです.
つまり,
void fill(int vc[],int no,int x)
という関数の 仮引数の名前を省略する形での宣言としては
void fill(int,int,int);
という記述は間違っているということです.
Re: 仮引数の省略でエラー
Posted: 2014年9月02日(火) 17:33
by spaaaark・∀・
usaoさんの補足という事で。
プロトタイプ宣言では確かに仮引数の名称を省略できますが、実はint aとint a[]では型が違います。
引数は1つにつき1つの情報しか渡せないので、配列のようにたくさんのデータがある場合は、
値全てを渡すわけではなく、別の物を渡してその関数内でも同じように扱えるような処理を行います。
少し考えてみてください。載せていただいたソースコードを実行すると、関数の実行前後で引数として
指定した配列要素の値が異なるはずです。でも、これは普通に考えればあれ?と思うはずなんです。
値全てを渡しているなら、仮引数から実引数の値を変更できないわけですから。
…勘がよければこれだけでint a[]が何を渡しているかが分かるはずです。
Re: 仮引数の省略でエラー
Posted: 2014年9月02日(火) 20:14
by 初級者
プロトタイプ宣言は、
関数定義の最初の行を
コピペして、最後に
セミコロンを付ければいい
だけなので、今回のような
内容の食い違いは
通常起こらないはず。
Re: 仮引数の省略でエラー
Posted: 2014年9月02日(火) 20:42
by みけCAT
C言語のプロトタイプ宣言では、「仮引数を省略」できます。(C++ではできません)
コード:
#include <stdio.h>
#define NUMBER 5
void fill();
int main(void){
int vc[NUMBER];
int i;
fill(vc,NUMBER,2);
for(i=0;i<NUMBER;i++){
printf("vc[%d]=%d",i,vc[i]);
}
return 0;
}
void fill(int vc[],int no,int x){
while(no-->0){
vc[no]=x;
}
}
C言語 : コンパイルが通る (警告も出ない)
C++ : コンパイルエラー
参考:
第3回 関数 | 株式会社きじねこ
Re: 仮引数の省略でエラー
Posted: 2014年9月02日(火) 20:44
by みけCAT
ジェリナゲ さんが書きました:授業で仮引数は省略しても構わないと習ったので次の様に省略したら
error: conflicting types for ‘fill’
void fill(int vc[],int no,int x){
^
note: previous declaration of ‘fill’ was here
void fill(int,int,int);
^
というようにエラーが出ました。
本当にそのような省略のしかたを習ったのですか?復習してみてください。
もしかして:C++の
デフォルト引数
Re: 仮引数の省略でエラー
Posted: 2014年9月02日(火) 21:14
by zeek
ジェリナゲ さんが書きました:授業で仮引数は省略しても構わないと習った
授業では「仮引数名」は省略しても構わないと習ったのではありませんか?
// void fill(int, int, int);
void fill(int [], int, int);
Re: 仮引数の省略でエラー
Posted: 2014年9月02日(火) 21:26
by hoge
みけCAT さんが書きました:
C言語のプロトタイプ宣言では、「仮引数を省略」できます。(C++ではできません)
厳密に言えば、
プロトタイプ宣言では「仮引数を省略」できません。
関数宣言のうち、仮引数の宣言を伴うものだけが関数のプロトタイプ宣言です。
コード:
void fill(); /* プロトタイプ宣言ではない関数の宣言 */
void fill(int[], int,int) /* プロトタイプ宣言 */
Re: 仮引数の省略でエラー
Posted: 2014年9月03日(水) 14:10
by ジェリナゲ
第一引数の型が違っていた、ということですね。
省略できると習ったのは引数名でした。
ありがとうございました。