2015-10-18 97 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);