2016-12-22 6 views
1

現在、私はかなりの時間を費やして仕事をしているプロジェクト(学校向け、はい)に取り組んでいますが、今は自分自身がエラーで解決できないように見えました。ここで助けを探しています。以下は、完全なコードではなく、必要と思われるコードです。どのように構造体に要素が格納されているリストを整理できますか?

int main(void) 
{ 
    typeAssociation association; 

    get_data(association); 

} 

エラーが関数sort_by_dateにあり、この機能は、(日付で(associados.txtによって与えられた)リストをソートすることになっている:私は(ファイルを呼び出した後に)持っている別のファイルに

typedef struct 
{ 
    int day, month, year; 
} typeDate; 

typedef struct 
{ 
    int number; 
    char name[20]; 
    char lastname[20]; 
    typeDate date_of_birth; 
} typeCard; 

typedef struct 
{ 
    int associate_number; 
    typeCard associates[MAX_ELEM]; 
} typeAssociation; 

typeDate date; 
typeCard card; 
typeCard aux; 

int get_data(typeAssociation association) 
{ 
    association.associate_number = 0; 

    int e, i; 

    FILE* read = fopen("associados.txt", "r"); 

    for (i = 0; fscanf(read, "%s %s %d %d %d %d", card.name, card.lastname, &card.number, 
        &date.day, &date.month, &date.year) 
     != EOF; 
     i++) 
    { 
     association.associate_number++; 
     card.date_of_birth = date; 
     association.associates[i] = card; 
    } 
    fclose(read); 

    printf("Sort list[1/2/3]?"); 

    scanf("%d", &e); 

    if (e == 1) 
    { 
     ordenar_n(&associacao);  
    } 
    (...) 
} 

int sort_by_date(typeAssociation association) 
{ 
    int g, m, i; 

    for (i = 0; i < association.associate_number - 1; i++) 
    { 
     m = i; 
     for (g = i + 1; g < data.year; g++) 
     { 
      if (date.year[g] < date.year[m]) 
      { 
       m = g; 
      } 

      if (date.year[g] == date.year[m]) 
      { 
       if (date.month[g] < date.month[m]) 
       { 
        m = g; 
       } 

       else if (date.month[g] == date.month[m]) 
       { 
        if (date.day[g] < date.day[m]) 
        { 
         m = g; 
        } 
       } 
      } 

      aux = association.associates[i]; 
      association.associates[i] = association.associates[m]; 
      association.associates[m] = aux; 
     } 
    } 
} 

構造体typeDateに格納されています)(最新のメンバーから最も古いものまで)。私は(私が間違っている場合は私を修正してください)私は一般的なアイデアが行くが、コードはないと思う。誰でも助けてくれますか? (これは私の最初の投稿ですので、間違いがあれば申し訳ありません)。

私のエラーは、sort_by_date関数にあります。

+3

STDのC libには、通常、Googleは通常、これらの機能を使用する例 –

+0

はい、私はリストを並べ替える機能でそこに構築されていることを認識していますが、ポイントイマイチがあり、qソート機能があります: – EngineerWannabe

+0

\それは次のようになります'associacao'の項目ではなく、何らかの理由でグローバル変数' data'と 'cartao'を使用している点を除いて、選択ソートをコーディングしています。グローバル変数がどのように値を取得し、アイテムを並べ替えるためにどの基準を使用するのか説明できますか? –

答えて

0

typeAssociationのアドレスを渡す必要があります。 また、あなたのコードでは、配列要素を間違っているいくつかのグローバル変数と比較しています。

int sort_by_date(typeAssociation *association) 
{ 
    int g=0, m=0, i=0; 

    for (i = 0; i < association->associate_number - 2; i++) 
    { 
     m = i; 
     for (g = i + 1; g < association->associate_number; g++) 
     { 
      if (association->associates[g].date.year < association->associates[m].date.year) 
      { 
       m = g; 
      } 

      else if (association->associates[g].date.year == association->associates[m].date.year) 
      { 
       if (association->associates[g].date.month < association->associates[m].date.month) 
       { 
        m = g; 
       } 

       else if (association->associates[g].date.month == association->associates[m].date.month) 
       { 
        if (association->associates[g].date.day < association->associates[m].date.day) 
        { 
         m = g; 
        } 
       } 
      } 
     } 

     //No need to do it in i loop 
     if(i != m) 
     { 
      aux = association.associates[i]; 
      association.associates[i] = association.associates[m]; 
      association.associates[m] = aux; 
     } 
    } 

    return 0; //Need to return an int value. 
} 
+0

あなたの助けていただきありがとうございますが、このソリューションを試してコンパイルすると、毎回エラーが発生します。 " - >"が使用されています。どうすればこの問題を解決できますか? – EngineerWannabe

+0

ありがとうございました!これは私が " - >"を "。" (ジョシュアが親切に説明したように、私は元のアイテムを変更したくないのでポインタは必要ありません)。 – EngineerWannabe

+0

@EngineerWannabe:ポインタを必要としない場合は、この関数を使用して関数を宣言してください。 'int sort_by_date(typeAssociation * association)'を 'int sort_by_date(typeAssociation association)'に変更します。警告が表示されない場合は、コンピュータに表示されているとおりに正確な警告メッセージを投稿してください。 – MayurK

1

あなたはvalueAssociationを値渡ししています。ソートは、渡されたオブジェクトには適用されません。また、独自のソートを記述しないでください。 qsortはライブラリ関数です。

int sort_by_date(typeAssociation *association) 
{ 
    qsort(association->associates, association->associate_number, sizeof(typeCard), compare_typeCard); 
} 

int compare_typeCard(const void *avoid, const void *bvoid) 
{ 
    typeCard *a = avoid; 
    typeCard *b = bvoid; 
    /* put your comparison code here */ 
} 

また、getAssociationを呼び出すのと同じ値渡しのエラーがあります。

+0

OPは望んでいないと思います'qsort'を使います。 – RoadRunner

+0

はい、私はそれが動作すると信じていますが、私はqsortでソートしていないと思います。そして、なぜそこにポインタを使用しますか?私は私の問題の他の解決策を探している間にそれを見たが、ポインタを使用する理由を理解できず、なぜ " - >"を使って構造体を呼び出すのかわからない – EngineerWannabe

+0

@EngineerWannabe "値で"何かを渡すと、元のアイテムは変更されません。 "参照で"何かを渡すと、関数はアイテムの元の場所へのポインタを期待し、 '.'の代わりに' - 'を使用し、' ano'のような構造体のメンバへのポインタを使用します。これにより、元のアイテムを変更することができます。 –

関連する問題