C のツリーを使用して、未定義のさまざまな数の入力フィールドを追跡しています。次のように、フィールド数が設定された構造体があります。
struct mystruct {
int id, mpid;
char *name;
struct myotherstruct *myostr;
};
メモリを割り当てるこの型 ( mystruct ) のポインター インスタンスがあり、ファイルから読み取った入力をこれらの構造体の値に入力します。次に、search.h の tsearch 関数を使用して、mystruct オブジェクトを mystruct ツリーに追加します。私が抱えている問題は、tfind 関数を使用してツリーから mystruct ポインターを取得する場合、返される mystruct メモリには、追加する前に値を作成するときに割り当ててポイントした myotherstruct ポインター データが記憶されないことです。木。
一般的な順序は次のとおりです。
struct mystruct {
int id, mpid;
char *name;
struct myotherstruct *myostr;
};
struct myotherstruct {
int spid;
};
// allocate memory to temporary mystruct pointer
// add mpid field to mystruct pointer ( used in comparison function )
if( // tfind == NULL )
{
// set id value
// allocate char memory and strncpy correct value in
// allocate myotherstruct memory and assign all values
// tsearch for this newly created mystruct memory chunk so that it is added to tree
}
else
{
// fails here when attempting to access the data returned by mytfind
}
...
gdb を使用すると、プログラムは最初に if ループに入り (ツリーが空であるため)、適切なメモリ割り当てで有効で完全な mystruct ポインターを作成します。tsearch が出力を返すと、メモリの場所は入力した mystruct ポインターの場所とは異なり、spid などの mystruct->myotherstruct 変数の出力を実行できません。gdb で印刷しようとしたときに得られる正確な出力は次のとおりです。 アドレス 0x でメモリにアクセスできません ----- は、明らかにアクセスできないメモリ内のさまざまな場所です。
mystruct mpid フィールドを比較して、mystruct オブジェクトのツリー ノードがまだ存在するかどうかを判断しているだけなので、比較関数に問題があるのではないかと思いますが、C と tsearch/tfind 機能の両方に関する経験不足が少し表れています。さまざまな tsearch.h Web ページで提供されている例は非常に洗練された例を処理していないため、より経験のある人が私を助けてくれることを願っています。助けてくれてありがとう!
PS: コードは C のままにしておく必要があるため、言語スワッピングでは不十分です :(
編集:
ここに私の比較機能があります:
int distcmp(const void *a, const void *b){
return ((int)((struct mystruct *)a)->mpid) != (int)(((struct mystruct *)b)->mpid);
}
また、ツリーに特定の値がまだ存在するかどうかを知りたいので、最初は tfind を使用します。存在しない場合 ( NULL を返す)、if ループに入り、新しい mystruct オブジェクトを埋めて、ツリーに追加します ( tsearch を使用)。既に存在する場合は、そのオブジェクトへのポインターが tfind から取得されます。これを mystruct ポインターに割り当て、コードの else 部分で使用します。うまくいけば、これが役に立ちます。再度、感謝します。
解決済み:
更新するために、問題は、tsearch および tfind から返されたポインターが mystruct 型ではないことです。これは、検索に一致した mystruct 値のメモリ位置へのポインターです。この場合、返されたポインターに * でアクセスし、その値を mystruct ポインターに渡すことで問題を解決できます。コメントしてくれた人に感謝します。