授業で仮引数は省略しても構わないと習ったので次の様に省略したら
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);
^
というようにエラーが出ました。
仮引数をしっかりと書いた場合はコンパイルが通りました。
どういうことでしょうか。
仮引数の省略でエラー
Re: 仮引数の省略でエラー
エラーメッセージの通りだと思いますが.
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);
という記述は間違っているということです.
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);
という記述は間違っているということです.
- spaaaark・∀・
- 記事: 66
- 登録日時: 10年前
- 住所: 埼玉
- 連絡を取る:
Re: 仮引数の省略でエラー
usaoさんの補足という事で。
プロトタイプ宣言では確かに仮引数の名称を省略できますが、実はint aとint a[]では型が違います。
引数は1つにつき1つの情報しか渡せないので、配列のようにたくさんのデータがある場合は、
値全てを渡すわけではなく、別の物を渡してその関数内でも同じように扱えるような処理を行います。
少し考えてみてください。載せていただいたソースコードを実行すると、関数の実行前後で引数として
指定した配列要素の値が異なるはずです。でも、これは普通に考えればあれ?と思うはずなんです。
値全てを渡しているなら、仮引数から実引数の値を変更できないわけですから。
…勘がよければこれだけでint a[]が何を渡しているかが分かるはずです。
プロトタイプ宣言では確かに仮引数の名称を省略できますが、実はint aとint a[]では型が違います。
引数は1つにつき1つの情報しか渡せないので、配列のようにたくさんのデータがある場合は、
値全てを渡すわけではなく、別の物を渡してその関数内でも同じように扱えるような処理を行います。
少し考えてみてください。載せていただいたソースコードを実行すると、関数の実行前後で引数として
指定した配列要素の値が異なるはずです。でも、これは普通に考えればあれ?と思うはずなんです。
値全てを渡しているなら、仮引数から実引数の値を変更できないわけですから。
…勘がよければこれだけでint a[]が何を渡しているかが分かるはずです。
クリエイティブな生活で刺激的な毎日を!
Re: 仮引数の省略でエラー
プロトタイプ宣言は、
関数定義の最初の行を
コピペして、最後に
セミコロンを付ければいい
だけなので、今回のような
内容の食い違いは
通常起こらないはず。
関数定義の最初の行を
コピペして、最後に
セミコロンを付ければいい
だけなので、今回のような
内容の食い違いは
通常起こらないはず。
Re: 仮引数の省略でエラー
C言語のプロトタイプ宣言では、「仮引数を省略」できます。(C++ではできません)
C言語 : コンパイルが通る (警告も出ない)
C++ : コンパイルエラー
参考:第3回 関数 | 株式会社きじねこ
#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++ : コンパイルエラー
参考:第3回 関数 | 株式会社きじねこ
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 仮引数の省略でエラー
本当にそのような省略のしかたを習ったのですか?復習してみてください。ジェリナゲ さんが書きました:授業で仮引数は省略しても構わないと習ったので次の様に省略したら
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++のデフォルト引数
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 仮引数の省略でエラー
授業では「仮引数名」は省略しても構わないと習ったのではありませんか?ジェリナゲ さんが書きました:授業で仮引数は省略しても構わないと習った
// void fill(int, int, int);
void fill(int [], int, int);