указатель (ссылка на структуру) в качестве аргумента функции для присвоения значения - PullRequest
1 голос
/ 26 февраля 2011

Я новичок в программировании и заранее прошу прощения, если мой вопрос слишком глуп.

Мой проект на c ++ скомпилирован как библиотека .xll (DLL для 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 - ошибки нет.

Я предполагаю, что это неправильное использование памяти, но для меня крайне важно изолировать функциональность в разных модулях (например, date.c, array.c, sorting.c ...).

Я не знаю, где искать, возможно, у меня неправильные настройки компиляции проекта.

1 Ответ

0 голосов
/ 26 февраля 2011

Кажется, что вы вызываете функцию из места, где ее объявление не видно. Если вы это сделаете, компиляция не знает, какие типы должны иметь параметры, поэтому она передает их как целые числа.

Функции, вызываемые из другого файла .c, должны быть объявлены в соответствующем файле .h и включены во все файлы .c с помощью функции.

...