0

Swenson の Timsort の C 実装を見つけました: https://github.com/swenson/sortは古い SO の質問の 1 つに記載されています。

2 つの問題が発生しました。

1)それを使用するには、ソートしたいタイプに適した SORT_CMP マクロを定義する必要があります。私のタイプは次のように定義されています(ここでは少し簡略化されています):

typedef struct{
    int a;
    int b;
} MyType

私は定義しようとします:

#define SORT_TYPE MyType
#define SORT_CMP(x,y) (x.a - y.a)

しかし、エラーが発生し続けます:「構造体でも共用体でもない何かでメンバー 'a'を要求しています」おそらくxとyはポインターになると思いましたが:

#define SORT_CMP(x,y) (x->a - y->a)

どちらも機能しません。それを手伝ってくれませんか?私はCの初心者で、おそらく基本的なものが欠けています。

2) Visual Studio でそのコードをコンパイルする方法はありますか? 新しい C 標準 (ブロックの途中の宣言など) のものを使用し、cl.exe はそれを受け入れません。GCC(mingw)を使用してコンパイルしましたが、mingwは残りのコードでVCよりも20%遅い(O2またはO3フラグ対/ Oxのlc.exe)ため、stdlib qsortの代わりにTimsortを使用することで得られる利益それを補うことはありません。同じことが Pelles コンパイラにも当てはまります。私のデータのほとんどには、部分的にソートされたシーケンスが多数あり、ソートには実行時間の約 50% がかかるため、VC で動作させると仮定すると、ここで利益が得られると感じています。

4

1 に答える 1

2

次のように、マクロパラメータの前後に括弧を追加してみてください。

#define SORT_CMP(x,y) ((x).a - (y).a)

ほとんどの場合、マクロはSORT_TYPE変数への逆参照ポインターで使用されます。

SORT_TYPE * pMyTypeVar1, pMyTypeVar2;
...
SORT_CMP(*pMyTypeVar, *pMyTypeVar2);

その場合、マクロのパラメーターを囲む括弧が欠落していると、プリプロセッサーは次のようなものを生成します。

(*pMyTypeVar1.a - *pMyTypeVar2.a)

aまた、ドット演算子はスター演算子よりも緊密にバインドされるため、コンパイラはポインタのメンバーを見つけようとしますがpMyTypeVar1pMyTypeVar2これは機能しません。

提案されているように括弧を使用すると、次のようになります。

((*pMyTypeVar1).a - (*pMyTypeVar2).a)

このようにして、コンパイラは最初に逆参照pMyTypeVar1pMyTypeVar2、最後にメンバーを見つけることができますa

于 2012-06-12T17:55:33.773 に答える