何が原因であるのか分からないので、お願いします。
doubleへのポインタ引数xとdouble型の引数dをもつpadd関数を定義し,2つの実数を
加算するプログラムを作成しなさい.
void padd(double *x, double d);
/* ポインタ引数xが指す変数に引数dを加算する */
main関数では,scanf関数を使って2つの実数を入力し,padd関数を呼んでから加算結果を出力する.
padd関数にはprintf, scanfを書いてはいけない.大域変数を使ってはいけない.
ポインタを使用した2つの実数を加算するプログラムについて
Re: ポインタを使用した2つの実数を加算するプログラムについて
何の原因の話かおよび何をお願いされているのかがわからないですが、このプログラムにはMakoto さんが書きました:何が原因であるのか分からないので、お願いします。
- 未初期化の自動変数x(不定)が指す場所にデータを読み込もうとしている
- padd関数に渡している第一引数の型が違う
- printfに渡しているデータの型が違う
- padd関数でansの値が投げ捨てられており、不自然
- main関数で未初期化の自動変数ansの値(不定)がreturnされている
- 関数がネストされている (GCC拡張、使う必要は無いはず)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ポインタを使用した2つの実数を加算するプログラムについて
超初心者さんが書かれた通りにすると解決したのですが何故16行目の&sumという引数だけで足されていることになっているのか分かりません。アドレス参照演算子は変数のアドレスに値を代入するという意味は知っているのですが・・・
Re: ポインタを使用した2つの実数を加算するプログラムについて
足し算をする処理はpadd関数に書かれているので、Makoto さんが書きました:何故16行目の&sumという引数だけで足されていることになっているのか分かりません。
「&sumという引数だけで足されている」というのが意味がよくわかりません。
もう少し詳しく説明していただけますか?
ググッた結果、「アドレス参照演算子」はアドレス演算子&のことであるとするサイト(例:Debugging with GDB - 異なる言語の使い方)と、Makoto さんが書きました:アドレス参照演算子は変数のアドレスに値を代入するという意味は知っているのですが・・・
間接演算子*のことであるとするサイト(例:C言語のポインタ基本 - Qiita)があり、意味がよくわかりません。
しかし、
アドレス演算子&は、変数(左辺値)のアドレスを取得する演算子であり、「アドレスに値を代入」はしません。
間接演算子*は、ポインタをデリファレンスして左辺値を取得する演算子であり、それだけで「値を代入」はしません。(代入演算子で代入することもできますし、読むだけで使うこともできます)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ポインタを使用した2つの実数を加算するプログラムについて
みけCATさん、何度も返信ありがとうございます。足し算の件は始めのpadd関数を忘れていました(-_-;)
また、アドレス演算子&と間接演算子*の違いについての違いを教えてくださってありがとうございます。
また、アドレス演算子&と間接演算子*の違いについての違いを教えてくださってありがとうございます。
Re: ポインタを使用した2つの実数を加算するプログラムについて
別解です。
実行結果
出題者は、「ポインタを使うと、呼出し元の変数を読み書きできる」と
いうことを理解させようとしているのではないでしょうか?
for文を使うことは想定していないと思うんですが。
#include <stdio.h>
void padd(double *x, double d);
int main(void)
{
double a, b;
printf("2つの実数を入力\n");
scanf("%lf%lf", &a, &b);
padd(&a, b);
printf("加算結果は %g\n", a);
return 0;
}
void padd(double *x, double d)
{
*x += d; // *x = *x + d; でもよい
}
いうことを理解させようとしているのではないでしょうか?
for文を使うことは想定していないと思うんですが。