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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C言語彷徨い人

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

#1

投稿記事 by C言語彷徨い人 » 8年前

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と表示されてしまいます
なぜなのか教えてください

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 8年前

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で殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 8年前

ほしいのはこのような出力ですか?

コード:

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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 8年前

あ、すいません。もとの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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

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

#5

投稿記事 by あんどーなつ » 8年前

??? こうじゃないですか?

コード:

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

閉鎖

“C言語何でも質問掲示板” へ戻る