2015-10-18 89 views
0

我想將三個結構數組傳遞給一個函數,該函數對存儲在結構數組中的三個數進行排序,但不想將實際值更改爲數組是通過引用傳遞,有我的問題,任何想法接受謝謝:)將結構數組傳遞給函數C

這是我審查代碼:

#include <stdio.h> 
#define N 3 
typedef struct 
{ 
    int digito; 
} numbers; 

void sort(numbers tabla[], int nro); 
void enternums(numbers tabla[], int nro); 

int main() 
{ 
    static numbers enter[N]; 
    int i, j, tmp; 
    enternums(enter, N); 
    printf("Data before entering the function...\n\n"); 
    for (i = 0 ; i < N ; i++) 
    { 
     printf("%d\n", enter[i].digito); 
    } 
    sort(enter, N); 

    printf("After entering data function....\n\n"); 
    for (i = 0 ; i < N ; i++) 
    { 
     printf("%d\n", enter[i].digito); 
    } 
    return 0; 
} 

void enternums(numbers tabla[], int nro) 
{ 
    int i; 
    for (i = 0 ; i < nro ; i++) 
    { 
     printf("Enter a digit for the position %d: ", i); 
     scanf("%d", &tabla[i].digito); 
    } 
} 

void sort(numbers tabla[N], int nro) 
{ 
    int i, j, tmp; 
    for (i = 1 ; i < nro ; i++) 
    { 
     j = i; 
     tmp = tabla[i].digito; 
     while ((j > 0) && (tmp < tabla[j - 1].digito)) 
     { 
      tabla[j].digito = tabla[j - 1].digito; 
      j--; 
     } 
     tabla[j].digito = tmp; 
    } 
} 
+1

你不需要編寫這樣的代碼,它很難閱讀,你可以像我一樣做。當然,數組並不是通過引用傳遞的。 –

+0

我真的不明白你真正想要什麼,'scanf(「%d」,&tabla [i] .digito);'是你的代碼中的一個潛在的錯誤,因爲你不檢查返回的值,即成功或者'scanf()'失敗。 –

+1

您可以複製傳遞的數組並對其進行排序 – bpgeck

回答

1

傳遞數組的指針到它的第一要素,有,你實際上可以通過另一個陣列的優勢存儲新值

void sort(const numbers *const tabla, numbers *resultado, int nro) 
{ 
    int i, j, tmp; 
    for (i = 1 ; i < nro ; i++) 
     resultado[i].digito = tabla[i].digito; 
    for (i = 1 ; i < nro ; i++) 
    { 
     tmp = resultado[i].digito; 
     for (j = i ; (j > 0) && (tmp < resultado[j - 1].digito) ; --j) 
      resultado[j].digito = resultado[j - 1].digito; 
     resultado[j].digito = tmp; 
    } 
} 

製作while循環代替for循環,它會使你的代碼更清晰。

,並使用這個

int main() 
{ 
    static numbers enter[N]; 
    static numbers ordenado[N]; 
    int i, j, tmp; 
    enternums(enter, N); 
    printf("Data before entering the function...\n\n"); 
    for (i = 0 ; i < N ; i++) 
    { 
     printf("%d\n", enter[i].digito); 
    } 
    sort(enter, ordenado, N); 

    printf("After entering data function....\n\n"); 
    for (i = 0 ; i < N ; i++) 
    { 
     printf("%d\n", ordenado[i].digito); 
    } 
    return 0; 
} 

同時,使你的代碼通過檢查可能存在的錯誤更安全,例如

scanf("%d", &tabla[i].digito); 

應該

if (scanf("%d", &tabla[i].digito) != 1) 
    Oops_there_is_a_problem_dont_use_this_value_maybe_ask_again(); 

自動發生,它不通過引用傳遞,它被轉換爲指針

0

除非它們被包含在一個struct不能按值傳遞數組。

您可以使用:

typedef struct MyStrutArray 
{ 
    numbers enter[N]; 
} MyStructArray; 

,然後使用:

void sort(MyStructArray array);