仮引数の省略でエラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ジェリナゲ
記事: 17
登録日時: 5年前

仮引数の省略でエラー

#1

投稿記事 by ジェリナゲ » 5年前

授業で仮引数は省略しても構わないと習ったので次の様に省略したら
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;
  }

}
 

アバター
usao
記事: 1587
登録日時: 7年前

Re: 仮引数の省略でエラー

#2

投稿記事 by usao » 5年前

エラーメッセージの通りだと思いますが.
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・∀・
記事: 62
登録日時: 7年前
住所: 京都のどこかの学寮
連絡を取る:

Re: 仮引数の省略でエラー

#3

投稿記事 by spaaaark・∀・ » 5年前

usaoさんの補足という事で。

プロトタイプ宣言では確かに仮引数の名称を省略できますが、実はint aとint a[]では型が違います。
引数は1つにつき1つの情報しか渡せないので、配列のようにたくさんのデータがある場合は、
値全てを渡すわけではなく、別の物を渡してその関数内でも同じように扱えるような処理を行います。

少し考えてみてください。載せていただいたソースコードを実行すると、関数の実行前後で引数として
指定した配列要素の値が異なるはずです。でも、これは普通に考えればあれ?と思うはずなんです。
値全てを渡しているなら、仮引数から実引数の値を変更できないわけですから。
…勘がよければこれだけでint a[]が何を渡しているかが分かるはずです。
クリエイティブな生活で刺激的な毎日を!

初級者
記事: 200
登録日時: 9年前

Re: 仮引数の省略でエラー

#4

投稿記事 by 初級者 » 5年前

プロトタイプ宣言は、
関数定義の最初の行を
コピペして、最後に
セミコロンを付ければいい
だけなので、今回のような
内容の食い違いは
通常起こらないはず。

アバター
みけCAT
記事: 6281
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 仮引数の省略でエラー

#5

投稿記事 by みけCAT » 5年前

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回 関数 | 株式会社きじねこ
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6281
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 仮引数の省略でエラー

#6

投稿記事 by みけCAT » 5年前

ジェリナゲ さんが書きました:授業で仮引数は省略しても構わないと習ったので次の様に省略したら
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で殴ればいい!(死亡フラグ)

zeek

Re: 仮引数の省略でエラー

#7

投稿記事 by zeek » 5年前

ジェリナゲ さんが書きました:授業で仮引数は省略しても構わないと習った
授業では「仮引数名」は省略しても構わないと習ったのではありませんか?
// void fill(int, int, int);
void fill(int [], int, int);

hoge

Re: 仮引数の省略でエラー

#8

投稿記事 by hoge » 5年前

みけCAT さんが書きました: C言語のプロトタイプ宣言では、「仮引数を省略」できます。(C++ではできません)
厳密に言えば、プロトタイプ宣言では「仮引数を省略」できません。
関数宣言のうち、仮引数の宣言を伴うものだけが関数のプロトタイプ宣言です。

コード:

void fill(); /* プロトタイプ宣言ではない関数の宣言 */
void fill(int[], int,int) /* プロトタイプ宣言 */

ジェリナゲ
記事: 17
登録日時: 5年前

Re: 仮引数の省略でエラー

#9

投稿記事 by ジェリナゲ » 5年前

第一引数の型が違っていた、ということですね。
省略できると習ったのは引数名でした。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る