Я пытаюсь использовать создание C++-оболочки (используя MSVS2013) для некоторого кода fortran. Предполагается, что оболочка вызывается из DELPHI (старый код, созданный в DELPHI 5, который я не могу коснуться). (ДЕЛЬФИ -> C++ DLL -> DLL Fortran) Цель состоит в том, что некоторые данные struct
с (record
в Дельфах) с int
х и double
х и double[]
-х передаются от Дельфы к Fortran для вычислений. С ++ dll -> fortran не проблема - я тестировал другой исполняемый файл C++. Оно работает. Проблема в том, что delphi вызывает вызовы C++ и C++ fortran. Затем я получаю сообщение об ошибкеОшибка при вызове C++ dll из delphi
Проект «myDelphiProject.exe» поднял класс исключений EZeroDivide с сообщением «Деление с плавающей запятой на ноль».
Нет проблем при вызове оболочки C++, если вызов fortran не выполняется. Я протестировал и подтвердил, что все переменные проходят между delphi и C++. Соглашение о вызовах установлено в cdecl
.
упрощенный код: Delphi
interface
rec1 = record
var1,var2: double;
end;
procedure myCppWrap(record1: myrecord); cdecl; external 'mycppwrap.dll' name '_myCppWrap'
implementation
procedure MyDelphiFunc();
var
...
begin
myCppWrap(rec1)
...
Упрощенный C++ код:
struct rec1
{
double var1,var2;
}
extern "C" __declspec(dllexport) __cdecl myCppWrap(rec1 r1);
extern "C" *myFortranSub(double *varF1,double *varF2);
Короче: DELPHI -> C++ работает, C++ -> Fortran работы, DELPHI -> C++ -> Fortran не работает.
Кто-нибудь имеет представление о том, что не так?
EDIT: ОК .. так мне удалось сузить: У меня есть деление на ноль, что приводит к бесконечности (что является правильным внутренним результатом с данного входа - это не прямой выход из fortran dll). Это хорошо, когда вызывается C++, но не из delphi, когда dll fortran скомпилируется с использованием настроек выпуска по умолчанию. Однако он работает при использовании настроек отладки, как в C++, так и в delphi. Я вывод переменных в текстовый файл (до и после деления) для проверки, а во всех 4 случаях делитель равен 0, а результат - «инф» в трех случаях, которые идут хорошо. Как в режиме отладки, так и в режиме выпуска у меня есть тот же параметр для обработки исключений с плавающей запятой «Produce NaN, подписанные бесконечности и денормальные результаты».
Это оказывается большей проблемой настройки компилятора/флаг, чем кодирование ...
Кто есть опыт работы с этим ?? (я работаю на небольшой и проверяемым кусок кода)
Неправильно то, что у вас есть дефект в коде. Если вы на самом деле не показываете [mcve], мы не можем видеть ваш код. Либо сделайте это, либо выполните некоторую отладку самостоятельно.Отображение поддельного кода вообще не помогает. Ваш код на C++ явно подделка. Функции не имеют объявленных значений возврата. –
okidoki .. Я нахожусь на нем :) –
Это потому, что среда исполнения Delphi не допускает исключений с плавающей запятой. Если ваш код предназначен для работы с затем замаскированным, затем замаскируйте его. –