0

このキューベースの基数ソートを機能させようとしていますが、何が問題なのかわかりません。テキストファイルを入力媒体として使用し、コンパイルしてテキストファイルで実行しようとすると、大量のエラーがスローされます。

この時点で、どんなアドバイスも役に立ちます。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
#define SHOWPASS


//Compiled Using GNU GCC Compiler


void radixsort(int *a[], int n)
{
  int i, b[MAX], m = *a[0], exp = 1;
  for (i = 0; i < n; i++)
  {
    if (*a[i] > m)
      m = a[i];
  }

  while (m / exp > 0)
  {
    int queue[10] =
    { 0 };
    for (i = 0; i < n; i++)
      queue[*a[i] / exp % 10]++;
    for (i = 1; i < 10; i++)
      queue[i] += queue[i - 1];
    for (i = n - 1; i >= 0; i--)
      b[--queue[*a[i] / exp % 10]] = *a[i];
    for (i = 0; i < n; i++)
      *a[i] = b[i];
    exp *= 10;

    #ifdef SHOWPASS
      printf("\nPASS   : ");
      radixsort(a, n);
    #endif
  }
}


int main( int argc, char *argv[] )
{
    if ( argc != 3 )
    {
  printf("Need two input parameters in the following order: \n 1. Input file path \n 2. Number of elements in file\n");
  return 0;
}
 int num_elements = atoi(argv[2]);
 int *input_arr = (int*) calloc (num_elements, sizeof(int));
 int i;

    FILE *fin; //File pointer to read input file
    fin = fopen(argv[1], "r"); //Initialize file pointer

for(i=0; i<num_elements; i++)
{
fscanf(fin, "%d", &(input_arr[0]));
}


radixsort(input_arr[0], i);


printf ( "\nArray before sorting: \n") ;

for ( i = 0 ; i < num_elements ; i++ )
printf ( "%d\t", input_arr[0] ) ;
printf ( "\n\n");
return 0;enter code here
}
4

1 に答える 1

0

あなたのコードにはたくさんのエラーがあります。まず、入力の仕方が間違っています。

fscanf(fin, "%d", &(input_arr[0]));

入力を取得している間、配列 input_arr は、input_arr[0] で単一の入力値で埋められます。入力の残りは、input_arr[0] で上書きされます。

に置き換えますfscanf(fin, "%d", &(input_arr[i]));

出力を間違った方法で表示していても、次の誤ったステートメントのために、並べ替え後、同じ出力が num_elements 回表示されます。

printf ( "%d\t", input_arr[0] ) ;

再び上記のステートメントを に置き換えprintf ( "%d\t", input_arr[i] )ます。

以下の誤った記述の影響として、

fscanf(fin, "%d", &(input_arr[i]));

Segmentation faultfunctionradixsortでは、0 から n-1(要素数) まで反復しているため、プログラムは を経験します。

 for (i = 0; i < n; i++)
 {
   if (*a[i] > m)
   m = a[i];
 }

a[0] のみが入力値で満たされ、残りの配列 (a[1] から a[n-1] まで) にはガベージ値が含まれているため、コードの実行中にランタイム エラーが発生します。

他にも多くのバグがあり、修正しました。これは完璧な実行コードです:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
// #define SHOWPASS


// Compiled Using GNU GCC Compiler


void radixsort(int a[], int n)
{
    int i, b[MAX], m = a[0], exp = 1;
    for (i = 0; i < n; i++)
    {

        if (a[i] > m)
            m = a[i];
    }

    while (m / exp > 0)
    {
        int queue[10] = { 0 };
        for (i = 0; i < n; i++)
            queue[a[i] / exp % 10]++;
        for (i = 1; i < 10; i++)
            queue[i] += queue[i - 1];
        for (i = n - 1; i >= 0; i--)
            b[--queue[a[i] / exp % 10]] = a[i];
        for (i = 0; i < n; i++)
            a[i] = b[i];
        exp *= 10;

#ifdef SHOWPASS
        printf("\nPASS   : ");
        radixsort(a, n);
#endif
    }
}


int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        printf
            ("Need two input parameters in the following order: \n 1. Input file path \n 2. Number of elements in file\n");
        return 0;
    }
    int num_elements = atoi(argv[2]);
    int *input_arr = (int *)calloc(num_elements, sizeof(int));
    int i;

    FILE *fin;                  // File pointer to read input file
    fin = fopen(argv[1], "r");  // Initialize file pointer

    for (i = 0; i < num_elements; i++)
    {
        fscanf(fin, "%d", &(input_arr[i]));
    }


    radixsort(input_arr, i);


    printf("\nArray before sorting: \n");

    for (i = 0; i < num_elements; i++)
        printf("%d\t", input_arr[i]);
    printf("\n\n");
    return 0;
}
于 2013-03-15T04:39:59.533 に答える