2011-09-27 3 views
0

데이터를 읽는 함수를 사용하여 배열에 저장 한 다음 배열을 main()으로 반환하여 정렬 프로세스를 수행하려고 시도한 프로그램을 작성하려고했습니다. 여기에 내가 가진 무엇함수에서 반환 된 포인터에서 배열 내용을 액세스합니다.

 #include <stdio.h> 
    #include <stdlib.h> 
    #define RESERVED_ARRAY_SIZE 100 

    int* read_data_from_files() 
     { 
     int* arr = (int*) malloc(sizeof(int) * 50); 

     int arr_count; 
    int status; 
    int i,j ; 

    arr_count =0; 
    i=0; 
    FILE *cfPtr; 
    if ((cfPtr = fopen ("score.dat", "r"))== NULL) 
    { 
     printf("File cannot be opend\n"); 
     } 
    else 
    {   
     fscanf(cfPtr, "%d", &arr[i]); 
     printf("%5d%5d\n", i, arr[i]); 

     while (!feof (cfPtr)) 
     {     
      ++i; 
      ++arr_count; 
      status = fscanf(cfPtr, "%d", &arr[i]); 

      if (status == EOF) 
      { 
        break; 
        } 

     else if (status != 1) 
     { 
       fprintf (stderr, "Error input\n"); 
       getchar();     
       } 

     if (arr_count >= RESERVED_ARRAY_SIZE) 
     { 
         fprintf(stderr, " The number of array is over.\n"); 
         getchar();       
         } 

      printf("%5d%5d\n", i, arr[i]);    
     } 
     fclose (cfPtr); 
     } 
     printf("arr_count=%d\n", arr_count); 
    return arr; 
    } 

int main() 
{ 
    int i; 
    int arr_count; 
    int* arr = (int*) malloc(sizeof(int) * 10); 
    arr = read_data_from_files(); 
    arr_count = sizeof(arr)/sizeof(arr[0]); 
    printf("this check the size of array%d", arr_count); 
    for (i=0; i<9; i++) 
    { 
    printf("%d ", i); 
    printf("%d", *arr[i]); 
    } 
    selection_sort(arr, arr_count); 

    getchar(); 
    return 0; 
    } 

내 질문 있습니다 1. 기능이 개 값을 반환 할 수없는 경우, I 메인에 funcution의 배열 크기 (내 프로그램에서 arr_count)을 통과하기 위해 무엇을 할 shuold()? 2. 함수가 배열 포인터를 main()으로 반환하는 경우 주 배열의 크기를 알아낼 수 있습니까? 나는 어떻게해야합니까? 비서를 위해 많이 필요합니다.

+0

C 및 C++ 언어 나는 당신이 이전을 골랐다 고 믿습니다. –

+0

함수에'i'와'arr_count'가 둘 다 필요하지 않습니다. 그들은 항상 같은 가치를 지니고 있습니다. 그리고 들여 쓰기는 코드를 정확하게 읽지 못하게합니다. 좋은 들여 쓰기 (특히 SO를위한 완벽한 탭)는 코드를 읽기 쉽게 만듭니다. –

+0

배열에 50 개의 항목을 할당하지만 RESERVED_ARRAY_SIZE (별명 100)를 사용하여 오버플로를 테스트하는 것은 유감입니다. 오버플로에 대한 테스트를 수행합니다. 불행히도, 당신은 문제를 너무 늦게 발견합니다. 일관성은 프로그래밍에서 매우 중요합니다. RESERVED_ARRAY_SIZE를 (를) 지속적으로 사용하면 도움이됩니다. 이 심볼은 디버그 심볼 테이블에 포함될 것이기 때문에 ('print RESERVED_ARRAY_SIZE' 등을 할 수 있기 때문에) 디버깅을 위해서는'enum {RESERVED_ARRAY_SIZE = 100};을 사용하는 것이 더 좋을 것입니다. 그러나 매크로 값은 그렇지 않습니다. –

답변

0

아니요, 자동으로 크기를 알아낼 수 없습니다.

int* read_data_from_files(int *result_size) 
{ 
    ... 
    *result_size = arr_count; 
    ... 
    return arr; 
} 

int main() 
{ 
    int arr_count; 
    int *arr = read_data_from_files(&arr_count); 
    ... 
} 
0

당신은 메인 함수에서 변수 size을하고, 함수 호출 패스를 할 수 : 여러 값을 반환하는 표준 방법은 여분의 반환 값을 저장하고자하는 변수에 대한 포인터를 전달하는 것입니다 추가 주소로 read_data_from_files()의 주소 그런 다음 read_data_from_files()은 함수 내부에서 값을 수정할 수 있으므로 반환하지 않아도됩니다.