2013-03-15 2 views
0

이 대기열 기반 기수 정렬을 작동 시키려고하는데이 배열의 잘못된 점을 파악할 수 없습니다. 그것은 입력 매체로 텍스트 파일을 사용하고 그것을 컴파일하려고하면 텍스트 파일과 함께 그것을 실행하려고하면 톤의 오류를 던졌습니다.(C) Radix 텍스트 파일의 배열 정렬

이 시점에서 조언이 도움이 될 것입니다.

#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 
} 
+1

'의 printf ("% d 개 \의 t"input_arr [0]); '// 0 : 이것은 완전한 실행 코드 고정 값 – BLUEPIXY

답변

0

코드에 많은 오류가 있습니다. 첫째, 입력하는 방식이 잘못되었습니다.

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

입력하면서, 어레이가 input_arr input_arr에서 단일 입력 값으로 충전된다 [0]. 나머지 입력은 input_arr [0]에 덮어 씁니다.

fscanf(fin, "%d", &(input_arr[i]));으로 바꿉니다. 잘못된 way.After 정렬에

비록 당신이 표시되는 출력은 동일한 출력은 다음 이유로 인해 잘못된 문장의 NUM_ELEMENTS 시간이 표시됩니다

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

가 다시 printf ("%d\t", input_arr[i])과 위의 문을 대체합니다. 다음과 같은 잘못된 문의 영향으로

,

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

,

프로그램 기능 radixsort에 있기 때문에, 당신은 0에서 N-1 (요소 수)에 반복되어하는 Segmentation fault을 경험한다.

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

로서 만 수행하면서 [0] 쓰레기 값을 포함하면 얻을 런타임 에러 (a A가 [N-1] [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; 
} 
+0

코어 덤프 세그멘테이션 오류가 여전히 존재한다. radixsort가 올바르게 실행되도록 논리를 편집하려면 어떻게해야합니까? – user2172359

+0

@ user2172359 : 10 가지 테스트 케이스에 대해 프로그램을 테스트했습니다. 그리고 완벽하게 작동합니다. 여기를 확인하십시오 : http://ideone.com/rL6Rx9. 이 프로그램은 여러분 자신을 알아 내야 만한다는 모호한 경우에 실패 할 수 있습니다. 나는 컴파일 오류와 논리적 오류를 수정했습니다. seg fault를 직접 수정하십시오 (존재하는 경우). 도움이 되었다면 대답을 수락하십시오. 감사합니다 :) –

+0

valgrind에서 프로그램을 실행 해보십시오. 그러면 런타임에 많은 클래스의 오류 (예 : 초기화되지 않은 메모리에 따라 if 문)가 감지됩니다. valgrind가 플랫폼에없는 옵션이라면 gdb 또는 다른 디버거를 사용해보십시오. – silentbicycle