2016-10-12 2 views
-2

Я пытаюсь использовать создание 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, подписанные бесконечности и денормальные результаты».

Это оказывается большей проблемой настройки компилятора/флаг, чем кодирование ...

Кто есть опыт работы с этим ?? (я работаю на небольшой и проверяемым кусок кода)

+0

Неправильно то, что у вас есть дефект в коде. Если вы на самом деле не показываете [mcve], мы не можем видеть ваш код. Либо сделайте это, либо выполните некоторую отладку самостоятельно.Отображение поддельного кода вообще не помогает. Ваш код на C++ явно подделка. Функции не имеют объявленных значений возврата. –

+0

okidoki .. Я нахожусь на нем :) –

+1

Это потому, что среда исполнения Delphi не допускает исключений с плавающей запятой. Если ваш код предназначен для работы с затем замаскированным, затем замаскируйте его. –

ответ

0

Итак, следуя совету David Heffeman «S ... добавление

use ifcore 

и

fpe_old_flags = FOR_SET_FPE(0) 

в начале кода решил его , Большое спасибо Дэвиду!

+0

Стоит отметить, что это специфично для компилятора Intel Fortran. –

Смежные вопросы