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;
}

我调试一个函数GetDate()并在尝试通过引用 ( mdy->year = tmpyear;) 分配值 2004 时出错。

错误是:

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

似乎您从其声明不可见的地方调用该函数。如果这样做,编译器不知道参数应该具有什么类型,因此它将它们全部作为整数传递。

从另一个 .c 文件调用的函数应在相应的 .h 文件中声明,并包含在所有使用该函数的 .c 文件中。

于 2011-02-26T11:33:52.330 回答