質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.08%

int型の配列において正常にインクリメントされない原因がわかりません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 734

apeirogon0813

score 69

前提・実現したいこと

基数ソートのプログラムにおいてある配列を0で初期化した後、インクリメントするようにしてみたのですが、出力を行ってみると0のままでインクリメントされていなく、原因がわかりません。

発生している問題・エラーメッセージ

d[0] = 75 or 4b
c[75] = 0
d[1] = 114 or 72
c[114] = 0
d[2] = 58 or 3a
c[58] = 0
d[3] = 57 or 39
c[57] = 0
d[4] = 114 or 72
c[114] = 0
となり、インクリメントされていない

該当のソースコード

#include<stdio.h>

struct point{ int x, y;};

void radix_sort(struct point a[], int n, int r, int dmax) {
  int i, j;
long long int d[128]; //(1)                                              
  struct point b[128];
  for(j=0; j<dmax; j++) {
     int c[500] = {0}; //////////このようにcの配列を初期化                                        
    for(i=0; i<n; i++) { //(2) && (4)                                    
      b[i] = a[i];
      d[i] =  (a[i].x >> (j * r)) & ((1 << r) - 1);
      printf("d[%d] = %d or %x\n",i,d[i],d[i]);
///////////////////////////
      c[d[i]]++; /////////この式においてインクリメントされない。
//////////////////////////
      printf("c[%d] = %d\n",d[i],c[i]);
    }
    for(i=1; i<r*dmax; i++) { //(3)                                      
      c[i] = c[i] + c[i-1];
      printf("c[%d] = %d\n",i,c[i]);
    }
    for(i=n-1; i>=0; i--) { //(5)                                        
      c[d[i]]--;
      a[c[d[i]]] = b[i];
    }
    for(i=0;i<n;i++) {
      printf("%d %d\n",a[i].x,a[i].y);
    }
    printf("--\n");
  }
}

  int main(void) {
    char buf[128];
    struct point p, arr[128];
    int i = 0, n, r, dmax;
    scanf("%d %d ",&r, &dmax);

    while(fgets(buf,sizeof(buf),stdin)!=NULL && i < 128){
      sscanf(buf,"%d %d",&p.x, &p.y);
      arr[i] = p;
      ++i;
    }
    n = i;
    radix_sort(arr, n, r, dmax);
    return 0;
  }

プログラムの概要

入力
7 3
1229427 -704
1816835 114
954607 -582
939698 -159
1882407 -873
で行なった時
2行目以降の値は座標を表しており今回はX座標を元に基数ソートをおこなう上で10進数から2^r進数に直しそれぞれの桁でバケツソートを行う。なお1行目の意味は7 ビットを 1 桁として 3 桁の数値と見て整列するという意味である。
整列の過程と結果は以下のようになる
1816835 114
1882407 -873
939698 -159
954607 -582
1229427 -704
________
1229427 -704
954607 -582
939698 -159
1816835 114
1882407 -873
_______
939698 -159
954607 -582
1229427 -704
1816835 114

1882407 -873

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

      c[d[i]]++; /////////この式においてインクリメントされない。
//////////////////////////
printf("c[%d] = %d\n",d[i],c[i]);

最初のインクリメントの式と、printfしてる c[i] と別の場所を見てることはわかってるでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/11 13:59

    ありがとうございます!少し解決しました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.08%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る