誕生日にもらった意外なもの

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

A 回答 (3件)

戻す配列ポインタの実体はどこにありますか?


その関数内にあって、普通に宣言した自動変数はリターンすると失われますので
その様な用途には使えません。

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の中を操作する(例えば大文字に変換するなど) */
}

この回答への補足

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

補足日時:2003/09/25 22:14
    • good
    • 0

>ポインタを用いて、関数にする前のプログラムが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;
}

}

この回答への補足

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

補足日時:2003/09/25 23:41
    • good
    • 0

そうですか? 私の環境ではビルドも実行もできましたよ。


(但し、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");

(省略)
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/09/26 01:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報