【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21960

整列プログラムの実行エラー
投稿者---勇太(2005/07/16 09:48:41)


Windows2000 borlandC++

基数ソートと挿入ソートをあわせた整列プログラムを作ったのですが、コンパイルまではできるのですが、実行するとエラーになってしまいます。プログラムのどの部分が間違っているのか教えてください。

#include <stdio.h>
#include <stdlib.h>
#define SIZE 8
#define SIZE2 (1 << SIZE)
#define MASK (SIZE2 - 1)
int count[SIZE2];
int *a, *b;
void sort(int *a, int *b, int n) { 
    int scale;
    int *x, *y, *p;  
    int i, j, k;
    x = a;
    y = b;
    for(scale = 16; scale < SIZE * sizeof(int) / sizeof(char); scale += SIZE) {
       for(j =0; j < SIZE2; j++)
          count[j] = 0;
       for(i =0; i < n; i++)
          count[(x[i] >> scale) & MASK]++;
       count[0]--;
       for(j =1; j < SIZE2; j++)
          count[j] += count[j-1]; 
       for(i = n - 1; i >= n; --i) 
          y[count[(x[i] >> scale) & MASK]--] = x[i];
       p = y;
       y = x;
       x = p;
    }
    if( p != a)
       for(i = 0; i < n; i++)
          a[i] = b[i];
    for(i = 1; i < n; i++) {
       k = a[i];
       for(j = i - 1; j >= 0; --j) {
          if(a[j] <= k)
             break;
          a[j + 1] = a[j];
       }  
       a[j + 1] = k;
    }
}
main(int argc, char *argv[]){ 
  int i, N = atoi(argv[1]), sw = atoi(argv[2]);
  *a = malloc(N*sizeof(int));
  *b = malloc(N*sizeof(int));
  if (sw) 
    for (i = 0; i < N; i++) {
      a[i] = 1000*(1.0*rand()/RAND_MAX);
      b[i] = 1000*(1.0*rand()/RAND_MAX);
    } else { 
      while (scanf("%d", &a[N]) == 1) N++;} 
  sort(a, b, N-1);
  for (i = 0; i < N; i++) printf("%3d ", a[i]);
  printf("\n");}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:整列プログラムの実行エラー 21962 RiSK 2005/07/16 10:35:42
<子記事> Re:整列プログラムの実行エラー 21963 RAPT 2005/07/16 10:45:17


No.21962

Re:整列プログラムの実行エラー
投稿者---RiSK(2005/07/16 10:35:42)


> プログラムのどの部分が間違っているのか教えてください。

VC6 警告レベル4でコンパイルした結果。
(43) : warning C4047: '=' : 間接参照のレベルが 'int ' と 'void *' で異なっています。
(44) : warning C4047: '=' : 間接参照のレベルが 'int ' と 'void *' で異なっています。
(47) : warning C4244: '=' : 'double ' から 'int ' に変換しました。データが失われているかもしれません。
(48) : warning C4244: '=' : 'double ' から 'int ' に変換しました。データが失われているかもしれません。
(28) : warning C4701: 値が割り当てられていないローカルな変数 'p' に対する参照が行われる可能性があります。



この投稿にコメントする

削除パスワード

No.21963

Re:整列プログラムの実行エラー
投稿者---RAPT(2005/07/16 10:45:17)


開発環境とエラーの場所・エラーメッセージを書きましょう。
で、ぱっとみて明らかにおかしいのは、
  1. main()で argcの値を確認せずにargvを参照している。
  2. main()で a,bのmalloc()の式が間違っている。
    int *a; *a = malloc... ではなく、a = malloc...が正解。
  3. main()で malloc()の戻り値チェックをしていない。
  4. sort()で 引数a,bのNULLチェックをしていない。
  5. sort()で sizeof(int) <= 2 の環境ではforブロックに入らないので
    未初期化の p が参照される。
  6. 全般的に変数の初期化がない。
  7. 不要なグローバル変数がある。これはローカル変数で充分。
おそらく、1番でアクセス違反で落ちているような気がする。 2番の結果はa,bを左辺値または値参照をしたときにアクセス違反になると思う。 それと、ぶら下がり文はなるべく書かない事をお奨めする。 > a[i] = 1000*(1.0*rand()/RAND_MAX); これは下記のように書ける。 a[i] = (int)(1000 * rand() / RAND_MAX);



この投稿にコメントする

削除パスワード

No.21966

Re:整列プログラムの実行エラー
投稿者---勇太(2005/07/16 13:22:37)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 8
#define M 255
#define MASK 0xff
int count[M+1];
void radixsort_insertion(int a[], int b[], int n) { 
    int scale;
    int *x, *y, *p;  
    int i, j, k;
    x = a;
    y = b;
    for(scale = 0; scale < 16; scale += SIZE) {
       for(j = 0; j <= M; j++)
          count[j] = 0;
       for(i = 0; i < n; i++)
          count[(x[i] >> scale) & MASK]++;
       for(j = 0; j < M; j++)
          count[j + 1] += count[j]; 
       for(i = n - 1; i >= 0; i--) 
          y[count[(x[i] >> scale) & MASK]--] = x[i];
       p = y;
       y = x;
       x = p;
    }
    if( p != a)
       for(i = 0; i < n; i++)
          a[i] = b[i];
    for(i = 1; i < n; i++) {
       j =i;
       while(j >= 1 && a[j-1] > a[j]) {
          k = a[j]; a[j] = a[j - 1];  a[j - 1] = k;
          j--;
       }  
    }
}
main(int argc, char *argv[]){ 
  clock_t start, end;
  int i, N = atoi(argv[1]), sw = atoi(argv[2]);
  int *a = malloc(N*sizeof(int));
  int *b = malloc(N*sizeof(int));
  if (sw) 
    for (i = 0; i < N; i++) {
      a[i] = 1000*(1.0*rand()/RAND_MAX); 
      b[i] = 0;
    } else { 
      while (scanf("%d", &a[N]) == 1) N++;
  } 
  start = clock();
  radixsort_insertion(a, b, N);
  end = clock();
  for (i = 0; i < N; i++) printf("%3d ", a[i]);
  printf("\n");
  printf("実行時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
}


アドバイスを参考に、プログラムをこのように変えたらできました。ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧