ページ 1 / 1
配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
Posted: 2016年11月27日(日) 14:47
by C言語彷徨い人
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: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
Posted: 2016年11月27日(日) 15:25
by みけCAT
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が出力されたのでしょう。
Re: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
Posted: 2016年11月27日(日) 15:33
by みけCAT
ほしいのはこのような出力ですか?
コード:
a[0] = 10
a[1] = 1
a[2] = 2
a[3] = 3
a[4] = 4
a[5] = 5
a[6] = 6
a[7] = 7
a[8] = 8
a[9] = 9
この出力をするプログラムの例
コード:
#include <stdio.h>
int rot_fwd2(int *a, int idx, int n){
return a[(idx + n - 1) % n];
}
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, j, i));
}
return 0;
}
Re: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
Posted: 2016年11月27日(日) 15:39
by みけCAT
あ、すいません。もとのrot_fwd2のコードを見て早とちりしてしまいました。
C言語彷徨い人 さんが書きました:2,3,4,5,6,7,8,9,10,1の順にそれぞれ表示させるつもり
ですね。
出力
コード:
a[0] = 2
a[1] = 3
a[2] = 4
a[3] = 5
a[4] = 6
a[5] = 7
a[6] = 8
a[7] = 9
a[8] = 10
a[9] = 1
プログラム例
コード:
#include <stdio.h>
int rot_fwd2(int *a, int idx, int n){
return a[(idx + 1) % n];
}
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, j, i));
}
return 0;
}
Re: 配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、
Posted: 2016年11月27日(日) 16:33
by あんどーなつ
??? こうじゃないですか?
コード:
#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;
}