2

MSDN の状態:

... したがって、DLL で作成された文字列または浮動小数点配列を返す場合、次の選択肢があります。

  • 動的に割り当てられたバッファーへの永続ポインターを設定し、ポインターを返します。関数の次の呼び出しで、(1) ポインターが null でないことを確認し、(2) 前の呼び出しで割り当てられたリソースを解放し、ポインターを null にリセットし、(3) 新しく割り当てられたメモリ ブロックにポインターを再利用します。...

free を呼び出すと、次のエラー ダイアログが表示されます。

MSVC++ Debug Library HEAP CORRUPTION DETECTED: after Normal block(#135) at 0x....... CRT は、ヒープ バッファーの終了後にアプリケーションがメモリに書き込みを行ったことを検出しました。

これが私のコードです:

FP * g_FP;

extern "C" FP * __stdcall xllFill(long rows, long cols) {

    if (g_FP != NULL) {
        free(g_FP);
        g_FP = NULL;
    }
    g_FP = (FP *)malloc(rows * cols * sizeof(double) + 2 * sizeof(unsigned short int));

    for (int i = 0; i < rows * cols; i++) {
        (*g_FP).data[i] = (double)i;
    }
    (*g_FP).rows = (unsigned short int)rows;
    (*g_FP).cols = (unsigned short int)cols;
    return g_FP;
}

私はC++に少し慣れていませんが、これが機能しない理由を一生理解できません。

4

3 に答える 3

2

FP次のように宣言されています。

typedef struct _FP
{
    unsigned short int rows;
    unsigned short int columns;
    double array[1];        /* Actually, array[rows][columns] */
} FP;

FPパックされ、パディングが含まれていないと想定しています。XLL がどのようにコンパイルされるのかはわかりませんが、 と の間にパディングがcolumnsありarray、それarrayを 8 バイトに揃える可能性が非常に高いと思います。既定の設定では、MSVC は 16 を返し、sizeof(FP)これは私の仮説を裏付けています。

割り当てを次のように変更します。

g_FP = malloc((rows*cols-1)*sizeof(double) + sizeof(*g_FP));

これが問題の原因ではない場合でも、上記の割り当ては論理的に正しい形式です。

そうでなければ、あなたのコードに問題があることはわかりません。g_FP初期化する際にもっと明示的にできると思いますが、それNULLはマイナーなポイントです。

于 2011-10-10T11:40:08.760 に答える
1

sizeof(FP)は 16 です。これは、行と列が最終的に整列されるためです (おそらく)。手動のサイズ計算ではこれを許可していません。

より良いコードは次のとおりです。

g_FP = (FP *)malloc(sizeof(sizeof(FP) - sizeof(double) + rows * cols * sizeof(double)); // -sizeof(double) to account for the double[1] already in the struct def.
于 2011-10-10T11:51:06.267 に答える
0

手間を省いて、 http://nxll.codeplex.comの FP クラスを使用してください。そのドキュメントはhttp://nxll.codeplex.com/wikipage?title=FPです。

于 2011-11-05T15:30:34.633 に答える