0

私はしばらくの間、この bsearch 宿題の問題を解決しようとしてきました。コードを使用して、最初に次のように 1 つのエントリを検索してみます。

int Compare(const void *a, const void *b);

void SortStudents(char *studentList[], size_t studentCount) 
{
    qsort(studentList, studentCount, sizeof(studentList[0]), Compare);
}

int Compare(const void *a, const void *b) 
{
    return (strcmp(*(char **)a, *(char **)b));
}

char *SearchList(char *key, char *list[], size_t num) 
{
    char **value = bsearch(&key, list, num, sizeof(list[0]), Compare);
    return (value == 0 ? 0 : *value);
}

/*Determines which registrants did not attend the first meeting by searching for registrants 
 that are not in attendees set. */
void DisplayClassStatus(
                        const char *registrants[], size_t registrantCount,
                        const char *attendees[],   size_t attendeeCount)
{
    char *missedFirstMeeting = SearchList((char *)registrants[0], (char **)attendees, attendeeCount);
}

MissedFirstMeeting は単一の値を適切に呼び出して動作しているように見えますが、次のようにループ内で SearchList 関数を繰り返し呼び出そうとすると、次のようになります。

for (int i = 0; i < attendeeCount; i++) {
    *missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}

セグメンテーション違反エラーが発生します。私には同じことをしているように見えますが、SearchList() を繰り返し呼び出すだけですが、セグメンテーション違反エラーが発生するため、明らかに何かが間違っています。何か案は?ありがとう。

4

5 に答える 5

2

firstMeeting の先頭の「*」を削除します。

missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
于 2010-02-21T20:24:19.150 に答える
1

さて、問題は次のとおりです。繰り返しますregistrantsが、処理されたアイテムになるとforは停止しattendeeCountます。また、missedFirstMeetingがchar *の場合は、tur1ngが言ったように、先頭の*を削除する必要があります。だからこれを行うだけです:

for (int i = 0; i < registrantCount; i++) {
    missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
    /* Code that uses missedFirstMeeting here */
}

SearchList編集:すべての戻り値を保持したい場合は、次のようにする必要があります。

char** missedFirstMeething = malloc(sizeof(char*)*registrantCount);
for (int i = 0; i < registrantCount; i++) {
    missedFirstMeeting[i] = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}

もちろん、使い終わったらmissedFirstMeeting、割り当てられたメモリを解放する必要があります。

于 2010-02-21T20:34:32.567 に答える
0

私があなたのコードで見た(少なくとも)2つの問題があります。

まず、些細ですが深刻なのは、ループがiとではないことforを比較する必要があるということです。registrantCountattendeeCount

2番目のCompare()は次のように書く必要があります。

int Compare(const void *a, const void *b) 
{
    return (strcmp((char *)a, *(char *)b));
}

voidポインタをcharポインタにキャストするだけです。これらを修正すると、SegFaultエラーが修正されます。

追加: forループでの間接参照はmissedFirstMeeting、2つの主要な問題の1つです。

  for (i = 0; i < registrantCount; i++) {
      missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
  }

ポインタのキャストは読みにくいです。

于 2010-02-21T20:41:13.177 に答える
0

さて、戻り値関数を変数に入れる必要があります。私は生計を立てるために C++ を書いています。上司はこのようなコードを決して受け入れません。このコードは非常に読みにくく、デバッグするのはさらに困難です。その理由は、変数の監視を設定できるためです。プログラムを 1 行ずつステップ実行すると、プログラムがどのように連鎖しているかを確認することもできます。デバッガーは、名前空間内のすべての変数とそれに対応する値を一覧表示します。これを読みやすいように書き直しながら、自分で問題を解決することは間違いありません。

于 2010-02-21T20:28:45.383 に答える
0

問題は、コンピューター変更可能なメモリの大きなブロックですが、プログラミングするときにそれを想像するのが最善の方法ではないことです。あなたはそのようにコンピューターをモデル化しましたが、うまくいきませんでした。

于 2010-02-21T21:23:45.047 に答える