0

グラフがあり、グラフの 1 つのパラメーターは等値関数です。

これは私が書いたコードです:

bool equalityFunction(void *char1,void *char2)
{
    if(strncmp((char *)char1,(char *)char2, 20) == 0)
        return true;
    return false;
}

この関数は、構造体ポインターを受け取り、これらのポインターが同一の文字列を指す文字ポインターを持つ構造体を指しているかどうかを確認することになっています。

理解するのが難しいか、情報が少ないかもしれませんが、equalityFunction をどのように書くことができるか考えられる人はいますか? ありがとう。

4

2 に答える 2

2

への引数equalityFunctionが構造体ポインタである場合は、それらをそのように扱う必要があります。

bool equalityFunction(void *struct1_, void *struct2_)
{
    struct someStruct *struct1 = struct1_;
    struct someStruct *struct2 = struct2_;
    if(strncmp(struct1->string, struct2->string, 20) == 0)
        return true;
    return false;
}

構造体自体を比較するのではなく、ポインタを含む文字列を比較します。


また、不必要なポインタ キャストを行わないようお勧めします。それらは何の役にも立たず、バグを隠している可能性があり、読むのがあまり良くありません。

于 2014-08-21T10:39:13.173 に答える
0

構造体へのポインターを比較する場合は、構造体へのポインターを引数として使用しますvoid*

bool equalityFunction(struct S* s1, struct S* s2)

このstrncmp関数は、最初の 0 バイトで比較を停止するため、任意の構造体の比較には適していません。最良の方法は、構造内の実際のフィールドを比較することです。

return s1->field1 == s2->field2 && ...

構造体のいずれかのメンバーを比較できない場合==(別の構造体や文字列など)、適切な比較を使用する必要がありますが、基本的な原則は、比較する必要があるすべてのフィールドを比較して、論理的等価性をチェックすることです。

于 2014-08-21T10:39:01.337 に答える