アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。 

下記は関数 intary_rcpy を使用して、配列 v2 の要素の順序を逆にして配列 v1 に格納するプログラムです。

関数の中で
v1[0] = v2[4]
v1[1] = v2[3]
.... と代入して、要素の順序をひっくり返そうと考えています。

想定している実行結果は 5, 4, 3, 2, 1 ですが、
実際の実行結果は 0, 5, 5, 5 となってしまいました。

関数部以外の問題のようにも思うのですが、どう間違っているのか
ご指摘いただける点がありましたら、お願いいたします。

=========================================
#include <stdio.h>

void intary_rcpy(int v1[], const int v2[], int no) {

int i;

for(i = 0; i < no; i++)
v1[i] = v2[no - 1];
no--;
return(v1);

}

int main(void)
{

#defineNUMBER5

int i;
int v1[] = {};
int v2[] = {1,2,3,4,5};

intary_rcpy(v1, v2, NUMBER);

for(i = 0; i < (NUMBER - 1); i++)
printf(" %d \n", v1[i]);

return 0;
}
=========================================


以上。

A 回答 (2件)

intary_rcpy()内のfor文で「繰り返し実行される」のはどの部分だと思いますか?



>for(i = 0; i < no; i++)
>v1[i] = v2[no - 1];
>no--;
>return(v1);

ループ1回目…
iは0、noは引数で受け取ったままの状態なので……
v1[0] = v2[5 - 1];

ループ2回目…
iは1、noは引数で受け取ったままの状態なので……
v1[1] = v2[5 - 1];

ループ3回目…
iは1、noは引数で受け取ったままの状態なので……
v1[2] = v2[5 - 1];
(以下略)

forループが終わった後で
no--;
が実行されてnoが4になります。(が、その後returnするので意味はない)

今回の場合なら…
for(i = 0; i < no; i++)
v1[i] = v2[(no - 1) - i];
でしょうかね?


というか……
>nt v1[] = {};
で、添え字のサイズが不正…とかにならないんでしょうか?
# サイズ0の配列であれば……バッファオーバーフローでステキに破壊していきますが。(たぶんv2[]が壊させる)
    • good
    • 0
この回答へのお礼

具体例まで挙げていただきありがとうございます。

for 文で複数行を繰り返す際には {} が必要ということですね。
{} を付けてやり直した結果、別の問題が発生しましたが、解決することができました。

提示いただいた部分を使わせていただき、プラスいくつか手直しして
期待通りの結果を得ることができました。

おかげさまで配列の宣言と for 文について理解が深まり、
そのほかにも気が付いていなかった間違いに気が付くことができました。

有難うございました。


「変更内容」

> for(i = 0; i < no; i++)
> v1[i] = v2[no - 1];
> no--;

for(i = 0; i < no; i++)
v1[i] = v2[(no - 1) - i];



> int v1[] = {};

int v1[5] = {0};


> for(i = 0; i < (NUMBER - 1); i++)

for(i = 0; i <= (NUMBER - 1); i++)

お礼日時:2012/12/27 19:00

C11 は古いドラフトしか持ってなくって正式な規格は確認できないんだけど,


int v1[] = {};
は「右辺の {}」が構文エラーになってコンパイルできない (この判断に要素数は関係ないのでたとえば
int v1[5] = {};
でも同様) のが正常な動作だと思います>#1.

ところで, 実行結果でもう 1つ妙なことに気づきませんか?
    • good
    • 0
この回答へのお礼

ご指摘有難うございます。

配列の宣言方法を復習し、理解することができました。
理解が曖昧だったようで、先に進むうちに勘違いしてしまったようです。

苦C で提供されている開発環境で勉強しております。コンパイルと実行は可能でしたが、
コンパイル時に普段は出ないポップアップが出ておりました。
宣言を int v1[5] = {0}; することで解消されました。


有難うございました。

お礼日時:2012/12/27 18:45

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