2012-01-25 7 views
0

私はこのコードを持っているに別の変数に構造体の内容を渡します。私はトラブルに巻き込まれるところ今のC

pacient sortClients(int n, pacient *lista, int print) 
{ 
    pacient aux[50]; 

    for(i=0;i<n;i++) 
    *(aux+i)=*(lista+i); 

    //some modifications performed on aux 

    return *aux; 
} 

void sortAndShowByAge(int n, pacient *lista) 
{ 
    pacient aux[50]; 
    *aux=sortClients(n,lista,0); 

} 

最後の関数です。 AUXにレコードが1つしかない場合はOK、2つ以上ある場合は奇妙な文字が表示されます。最初の関数ではlistaを繰り返し、すべてのレコードをAUXに保存しました。 aAuxをsortClientsからauxにshortAndShowByAgeで直接割り当て、反復しないように割り当てる方法はありますか?私は、sortClientsを反復処理することはできません。

pacient sortClients(int n, pacient *lista, int print) 

戻り pacientのインスタンス:

+0

実際のコードを掲載してください。このスニペットはコンパイルされず、表示ロジックは表示されません。 –

答えて

2

コードは、配列全体ではなく、単一の要素を返します。それはローカル変数であるため、書かれた配列を合法的に返すことはできません。

新しいメモリを動的に割り当てるか、インプレースで並べ替える必要があります。

あなたはすでに持っているもののような、ほとんどである、元を、次のように行くだろう:

pacient * sortClients(int n, const pacient *lista, int print) 
{ 
    pacient *aux; 

    if((aux = malloc(n * sizeof *aux)) != NULL) 
    { 
     memcpy(aux, lista, n * sizeof *aux); 
     /*some modifications performed on aux */ 
    } 
    return aux; 
} 

は、これは、あなたが終わったら上free()を呼び出す必要がありソート処理/配列へのポインタを返します。メモリを漏らさないために

私はalaoで戻り値の型を修正し、手動ループの代わりにmemcpy()を使用して入力値をコピーしました。入力配列はconstとマークされています。これは、その関数が読み取り専用であるためです。

+0

元のコードはローカルへのポインタを返しません、値によって単一の配列要素を返します。私はOPの意図はUBになるローカル配列へのポインタを返すことだと思います。 –

+0

@DavidHeffernan:ありがとう、更新済み(@Alsも)。 – unwind

+0

@unwindありがとう、それは完全に動作します。それはまさに私が望んでいたものです – Andrew

1

問題はあります。それは、配列返しません:sortAndShowByAge()

return *aux; /* <---- synonymous with return aux[0]; */ 

を、以下では、単一返されています要素とaux[0]にコピーしとります

*aux=sortClients(n,lista,0); /* <---- synonymous with aux[0]=... */ 

私はこの問題を解決する最良の方法は、単にだろうと思いますsortClients()を用意して、指定された配列を修正して、何も返す必要はありません。それはバグを修正し、不必要なコピーの大部分を取り除くでしょう。

0

代わりにauxへのポインタを関数のパラメータとして渡します。 (あなたがループ内でそれらの変更を行う場合を除く)また、あなたの代わりにループのmemcpyをを使用することができます:あなたは、もちろん、あなたが既に持っているforループを使用することができます

void sortClients(int n, pacient *lista, pacient *aux, int print) 
{ 
    memcpy(aux, lista, n * sizeof(pacient)); 

    //some modifications performed on aux 
} 

void sortAndShowByAge(int n, pacient *lista) 
{ 
    pacient aux[50]; 
    sortClients(n,lista,aux,0); 

} 

。キーは、呼び出し元でauxが作成され、ポインタを渡します。

0

auxが関数内でローカルに宣言されているため、ソート関数は有効なコンテンツを返しません。

代わりに、あなたはその中に配列した構造を宣言し、コピー

typedef struct ret 
{ 
    pacient aux[50]; 
} ret_t; 

... 

ret_t sortClients(int n, pacient *lista, int print) {...} 

に取得することを返すか、あなたの関数内でmallocを使用して、配列を割り当て、そのメモリブロックのアドレスを返すことができ

pacient* sortClients(...) 

pacient *aux = malloc(50 * sizeof(pacient)); 
... 

return aux;