• ベストアンサー

関数の引数と戻り値

度々すいません。 関数に引数として配列のポインタを渡して、戻り値として配列のポインタを返したいのですが、やり方がよく分かりません。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

>ポインタを用いて、関数にする前のプログラムが2つ前の投稿 >「ポインタのエラー」にのっていますので、参照してください。 こちらですね。 http://www.okweb.ne.jp/kotaeru.php3?q=663939 それなら、関数の戻り値でresultを返す必要はないと思います。 こんな感じでいいと思います。 void add_n(int *a, int *b, int *result, int n) /* n は桁数 */ { int i, arry; /*配列resultの初期化*/ for(i=0;i<n+1;i++) *(result+i)=0; carry=0; /*result=a+bの演算*/ for(i=n; i>=0; i--){ *(result+i)=*(a+i)+*(b+i)+carry; if(*(result+i)>=10){ *(result+i)-=10; carry=1; } else carry=0; } }

StudentYuta
質問者

補足

コーディングまでしてくださり、ありがとうございます。 でもなぜかビルド(Visual Studio.NET Academic)すると, error C2664: 'addition' : 1 番目の引数を 'int' から 'int *' に変換できません。 というメッセージが出るのですがなぜでしょう?

その他の回答 (2)

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.3

そうですか? 私の環境ではビルドも実行もできましたよ。 (但し、int i, arry; →int i, carry; の間違いでした) ちなみに、main()はこうなります。 (基本的には、StudentYutaさんのソースのままです) void main() { (省略) /*配列bへの読み込み*/ for(i=1;i<N+1;i++) scanf("%d",&*(b+i)); *b=0; printf("入力された数値:"); for(i=1;i<N+1;i++) printf("%d",*(b+i)); printf("\n"); /* 関数呼び出し(resultを得る) */ add_n(a,b,result,N); /*演算結果の表示*/ printf("和:"); for(i=0;i<N+1;i++) printf("%d",*(result+i)); printf("\n"); (省略) }

StudentYuta
質問者

お礼

回答ありがとうございます。 関数を呼び出す際に、 add_n(*a,*b,*result); としてしまいました。間接演算子はいらないんですね。 ちなみに、桁数を表すnは#define文で宣言していたので省略しました。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.1

戻す配列ポインタの実体はどこにありますか? その関数内にあって、普通に宣言した自動変数はリターンすると失われますので その様な用途には使えません。 char *func1(char *str) { char a[256]; ...... return(a); ] この場合a[256]は、static宣言する必要があります。 char *func1(char *str) { static char a[256]; ...... return(a); ] 普通は、ポインタで渡した配列の中身を、関数内で書き換える場合が多いので、 ポインタで戻すことは余りありません。 void func2(char *str) { /* strの中を操作する(例えば大文字に変換するなど) */ }

StudentYuta
質問者

補足

すいません、質問が具体的でなかったですね。 今作っているのは、多数桁の演算(四則計算)をするプログラムで、2つの配列の配列要素に1桁ずつ入力して、それを演算した結果をまた別の配列に入力するというものです。 このプログラムで、演算する配列2つを関数に渡して、演算結果を戻り値にしたいと思います。 ポインタを用いて、関数にする前のプログラムが2つ前の投稿「ポインタのエラー」にのっていますので、参照してください。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう