code
double rot_fwd2(int *a, int n){
int i;
for (i = 1; i < n + 1; i++){
a = a[i-1];
}
if(i = 0){
a[0] = a[n];
}
return 0;
}
int
main(void)
{
int testi[10] ={1,2,3,4,5,6,7,8,9,10};
int i = 10;
int j;
for(j = 0; j < i; j++){
printf("a[%d] = %d\n", j, rot_fwd2(testi, i));
}
return 0;
}
/code
という関数を作り2,3,4,5,6,7,8,9,10,1の順にそれぞれ表示させるつもりなのですがすべて0と表示されてしまいます
なぜなのか教えてください
配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
Re: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
たまたまですね。C言語彷徨い人 さんが書きました:すべて0と表示されてしまいます
なぜなのか教えてください
あなたのプログラムは以下の理由で未定義動作を起こします。
- a = a[i-1];という行で配列の範囲外への書き込みを行っている
- printf("a[%d] = %d\n", j, rot_fwd2(testi, i));という行で%dで出力するデータはint型のものを渡さなければいけないのに、double型のデータを渡している
オフトピック
ちなみに、a[0] = a[n];という行はその前のif文の条件i = 0 (iに0を代入し、代入した値として評価される)が常に偽なので実行されず、未定義動作は起こしません。
例えばint型が4バイト、double型が8バイトのIEEE754フォーマットである場合、
double型の0は全てのビットが0として表され、int型としてその中の一部を読むと0とみなされるので、0が出力されたのでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
ほしいのはこのような出力ですか?
この出力をするプログラムの例
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
あ、すいません。もとのrot_fwd2のコードを見て早とちりしてしまいました。
出力 プログラム例
ですね。C言語彷徨い人 さんが書きました:2,3,4,5,6,7,8,9,10,1の順にそれぞれ表示させるつもり
出力 プログラム例
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
??? こうじゃないですか?
#include <stdio.h>
// example) a = { 0, 1, 2 }, n = 3
// -> a = { 1, 2, 0 }
void
rot_fwd2(int *a, int n)
{
int i;
int tmp = a[0];
for (i = 1; i < n; i++)
a[i-1] = a[i];
a[n-1] = tmp;
}
int
main(void)
{
int testi[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 10;
int j;
// 配列を1つシフトする
rot_fwd2(testi, i);
// シフトした結果を出力する
for (j = 0; j < i; j++) {
printf("a[%d] = %d\n", j, testi[j]);
}
return 0;
}