2

信じられないほど厄介なエラーをたまたまデバッグしました。自分の PC (Windows 7 x64、MinGw) で、C プログラムはmemcmp配列メンバーを比較するときに を使用して配列を正常にソートしました。

私の関数はバブルソートアルゴリズムを使用し、そのスケルトンは次のようになります。

void array_sort(ArrayMap *array, char direction) {
    make sure direction is +1 or -1 only
    define some variables
    for(...) {
         for(...) {
             cmpres = memcmp(elm1, elm2, sizeOfElement);
             if (cmpres!=0&&cmpres!=direction)
             {
                 SWAP here
             }
         }
}

今、私の PC では、memcmpが返され、別の PCでは-10およびが返されました。これを私と比較すると、ソートが完全に間違っていました。1-505direction

しかし、戻り値の絶対値 (つまりサイズ) はmemcmp実際には何を意味するのでしょうか。

www.cplusplus.comから:

メモリ ブロックの内容間の関係を示す整数値を返します。ゼロ値は、両方のメモリ ブロックの内容が等しいことを示します。ゼロより大きい値は、両方のメモリ ブロックで一致しない最初のバイトが、unsigned char 値として評価されたかのように、ptr2 よりも ptr1 に大きい値があることを示します。ゼロ未満の値はその反対を示しま​​す。

サイズについては言及されていません。彼らは +-1 について間違っていないように、ゼロより大きいと言っているだけです。

4

2 に答える 2

7

ドキュメントには次のように記載されています。

memcmp() 関数は、s1 が指すオブジェクトが s2 が指すオブジェクトより大きい、等しい、または小さい場合、それぞれ 0 より大きい、等しい、または小さい整数を返します。

-1または1を返すとは言っていません。正確に返されるものは実装に依存します。

アップデート:

比較関数を実装するときは、次のように書くことがよくあります。

return a[i] - b[i];

それ以外の:

if (a[i] > b[i])
    return 1;
else
    return -1;

これは、返される数値を説明する実装の 1 つです。

于 2014-05-12T20:36:17.573 に答える
4

結果の大きさは実装固有であるため、移植可能な意味はなく、依存するべきではありません。このmemcmp()関数は、正、負、またはゼロの値のみを返すことが保証されています。

任意の値を持つことができる理由は、memcmp()次のように定義できます。

// Types changed to "char" to simplify code.
int memcmp(const unsigned char *x, const unsigned char *y, size_t n)
{
    for (size_t i = 0; i < n; i++) {
        int diff = x[i] - y[i];
        if (diff)
            return diff;
}

ただし、SSE などを使用して実装することもでき、戻り値は異なります。

于 2014-05-12T20:36:04.017 に答える