ページ 11

配列をひとつずつ後ろにずらす関数をつくっているのですが、、、、

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;
}