2011-02-26 103 views
1

如果我的問題太愚蠢,我是編程中的新手,並提前道歉。我的C++項目編譯爲庫.xll(DLL for excel),框架代碼(程序入口點)編碼正確且工作穩定。自定義功能是獨立的模塊。作爲指定值的函數的參數指針(參考結構)

// 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 ...)至關重要。

我不知道在哪裏尋找,可能是我有錯誤的項目編譯設置。

回答

0

看起來像你從一個聲明不可見的地方調用該函數。如果你這樣做,編譯器不知道參數應該有什麼類型,所以它們都以整數形式傳遞它們。

從另一個.c文件調用的函數應該在相應的.h文件中聲明,並且包含在使用該函數的所有.c文件中。

+0

我認爲它不可能從函數聲明不可見的地方調用函數。這樣的代碼不能編譯 – 2011-02-26 11:38:51

+0

@Anton:如果你使用舊的C語言規則,你實際上可以。最初,您不必聲明參數或返回值,只要它們都是int類型即可。如果您以寬容模式運行C編譯器,那仍然有效。 – 2011-02-26 11:47:38

+0

它非常有趣我不知道這種可能性 – 2011-02-26 12:20:00