1

私はプログラミングの初心者であり、質問がばかげている場合は事前に謝罪します。

私のc++プロジェクトはライブラリ.xll(Excel用のDLL)としてコンパイルされ、フレームワークコード(プログラムエントリポイント)は正しくコーディングされており、安定して動作します。カスタム関数は個別のモジュールです。

// header.h
typedef struct _TMDYDate {
    long month;
    long day;
    long year;
} TMonthDayYear;

ファイルfuncs.cには次の機能があります。

// funcs.c
#include "header.h"

__declspec(dllexport) long GetDate() {
    TMonthDayYear myDate;
    myDate.day = 1 ;
    myDate.month = 1;
    myDate.year = 2000;

    if (DateToMDY(2004, &myDate) != 1) {
        return 0;
    }

    return myDate.year;
}

ここで、関数DateToMDYは別のファイルで宣言されていますDates.c

// dates.c

int DateToMDY (long tmpyear, TMonthDayYear *mdy) {
    mdy->year = tmpyear; // <- Error is here
    return 1;
}

関数をデバッグし、参照( )で値2004GetDate()を割り当てようとすると、エラーが発生します。mdy->year = tmpyear;

エラーは次のとおりです。

Unhandled exception at 0x0e342b84 (alcDates.xll) in EXCEL.EXE: 0xC0000005: Access violation writing location 0x40e3db28

面白いのは、DateToMDYの宣言をファイルfuncs.cに移動したときです。これは、が呼び出されたときと同じDateToMDYです。エラーはありません。

間違ったメモリ使用量だと思いますが、私にとっては、さまざまなモジュール(dates.c、array.c、sorting.cなど)の機能を分離することが重要です。

どこを探すべきかわかりません。プロジェクトのコンパイル設定が間違っている可能性があります。

4

1 に答える 1

0

宣言が表示されていない場所から関数を呼び出しているようです。そうした場合、コンパイルはパラメーターが持つべきタイプを認識しないため、パラメーターをすべてintとして渡します。

別の.cファイルから呼び出された関数は、対応する.hファイルで宣言し、関数を使用してすべての.cファイルに含める必要があります。

于 2011-02-26T11:33:52.330 に答える