ポインタについて質問です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
絵里

ポインタについて質問です。

#1

投稿記事 by 絵里 » 15年前

#include <stdio.h>

void sum_diff(int x,int y,int *wa,int *sa)
{
*wa=x+y;
*sa=x-y;
}

int main(void)
{

int n1=100,n2=200;
int sum,diff;

sum_diff(n1,n2,&sum,&diff);

printf("和 %d",sum);
printf("差 %d",diff);

return(0);
}

メイン関数を上に置きたいのですが、
下のように変更したらエラーが出ます。
”再定義されています。異なる基本型です。”

#include <stdio.h>

int main(void)
{

int n1=100,n2=200;
int sum,diff;

sum_diff(n1,n2,&sum,&diff);

printf("和 %d",sum);
printf("差 %d",diff);

return(0);
}

void sum_diff(int x,int y,int *wa,int *sa)
{
*wa=x+y;
*sa=x-y;
}

なぜなんでしょうか??
わかる方教えてください。

パコネコ

Re:ポインタについて質問です。

#2

投稿記事 by パコネコ » 15年前

両方起動してみて思ったことが…
上はちゃんと動きました。
下はうごかない。

>void sum_diff(int x,int y,int *wa,int *sa)
こいつが…
理由としては、宣言されてないから
上がうごく理由は知りませんが…メインより先に書いてあるからですかね。
あ、これは考えた結果であって間違ってる可能性があります。
あってますかね…

>わかる方教えてください。
わかる方じゃなくてすいません。

組木紙織

Re:ポインタについて質問です。

#3

投稿記事 by 組木紙織 » 15年前

main()の上に以下の一行を付け加えてください。
void sum_diff(int x,int y,int *wa,int *sa);


sum_diff()が使われる前にその関数がどんな型であるかを宣言しておく必要があります。

MAY

Re:ポインタについて質問です。

#4

投稿記事 by MAY » 15年前

> #include <stdio.h>

/*プログラムというのは上から下に流れるのでこの間に sum_diff という関数を使いますよという宣言*/

void sum_diff(int,int,int,int);
/*を入れておく必要があります*/

> int main(void)
> {
>
> int n1=100,n2=200;
> int sum,diff;
>
> sum_diff(n1,n2,&sum,&diff);
>
> printf("和 %d",sum);
> printf("差 %d",diff);
>
> return(0);
> }
>
> void sum_diff(int x,int y,int *wa,int *sa)
> {
> *wa=x+y;
> *sa=x-y;
> }

絵里

Re:ポインタについて質問です。

#5

投稿記事 by 絵里 » 15年前

ありがとうございます。

みなさん丁寧に教えてくださり助かりました。

またお力をお借りするかもしれませんが
よろしくおねがいします。

組木紙織

Re:ポインタについて質問です。

#6

投稿記事 by 組木紙織 » 15年前

先越されたみたいなので、追記です。


C言語のコンパイラは1パス方式なので、名前(識別子)を使うためには先に宣言する必要があります。

上側の例は、宣言と同時に実体の定義もしてますが、
下側の例は、宣言と実体の定義をわけています。


下の場合のエラーは、
C言語で宣言がされてないのに関数が使われた場合、戻り値がint型の関数を内部で宣言します。
この場合は "int sum_diff(n1,n2,&sum,&diff);"という関数ですね。
それなのに 後から戻り値がことなる関数を再度定義と同時に宣言してるので上記のようなエラーが出ます。

閉鎖

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