======Вызов функций C++ из Fortran-90====== Пример вызова функций статической библиотеки, написанной на языке //C++//, из программы, написанной на языке //Fortran-90// посредством интерфейса. =====Пример программы FortranExample===== Система, в которой тестировался данный пример: **Windows**. ====Структура программы==== Программа состоит из: * [[fortran90_call_cpp_static_library_throw_interface#FortranExampleLib.lib|статической библиотеки]] ''FortranExampleLib.lib''; * [[fortran90_call_cpp_static_library_throw_interface#FortranExampleExe.exe|основной программы]] ''FortranExampleExe.exe'', к которой эта библиотека линкуется. ===FortranExampleLib.lib=== Статическая библиотека, написанная на языке //C++//. Использовались: * компилятор //Microsoft Visual C++ 2008//, * //IDE// //Microsoft Visual Studio 2008//. В настройка проекта выставлено: ^ Конфигурация ^ Настройки ^ | //Debug// | __Configuration Properties -> C/C++ -> Code Generation -> Runtime Library -> Multi-threaded Debug (/MTd)__ | | //Release// | __Configuration Properties -> C/C++ -> Code Generation -> Runtime Library -> Multi-threaded (/MT)__ | #ifndef FORTRAN_EXAMPLE_LIB_H #define FORTRAN_EXAMPLE_LIB_H /** * Функция суммирования * @param value1 - первое слагаемое * @param value2 - второе слагаемое * @param sum - сумма */ extern "C" void Summation ( float value1, float value2, float& sum ); /** * Функция нахождения суммы элементов массива * @param arrayOfFloats - массив вещественных чисел одинарной точности * @param arrayLength - длина массива * @return - сумма элементов массива */ extern "C" float GetSumOfArrayElements ( float* arrayOfFloats, int arrayLength ); #endif #include "FortranExampleLib.h" /** Функция суммирования * @param value1 - первое слагаемое * @param value2 - второе слагаемое * @param sum - сумма */ //extern "C" void Summation ( float value1, float value2, float& sum ) { sum = value1 + value2; } /** * Функция нахождения суммы элементов массива * @param arrayOfFloats - массив вещественных чисел одинарной точности * @param arrayLength - длина массива * @return - сумма элементов массива */ //extern "C" float GetSumOfArrayElements ( float* arrayOfFloats, int arrayLength ) { float sum = 0; for (int i = 0; i < arrayLength; i++) { sum += arrayOfFloats[i]; } return sum; } ===FortranExampleExe.exe=== Программа на языке //Fortran-90//. Использовались: * компилятор //Intel Fortran Compiler 11//, * //IDE// //Microsoft Visual Studio 2008//. В настройках проекта выставлено: * __Configuration Properties -> Linker -> General -> Additional Library Directories -> __, * __Configuration Properties -> Linker -> Input -> FortranExampleLib.lib__. module LibInterface interface to subroutine Summation [C, alias:'_Summation'] (value1, value2, sum) real*4 value1 [value] real*4 value2 [value] real*4 sum [reference] end interface to real*4 function GetSumOfArrayElements [C, alias:'_GetSumOfArrayElements'] (arrayOfFloats, arrayLength) real*4 arrayOfFloats(*) integer*4 arrayLength [value] end end module LibInterface program FortranExampleExe use LibInterface implicit none real*4 value1, value2, sum real*4 arrayOfFloats(100) integer*4 arrayLength real*4 sumOfArrayElements integer*4 index print *, 'Fortran example' value1 = 2.5 value2 = 3 call Summation(value1, value2, sum) print *, 'Summation: ' print *, 'value1 = ', value1 print *, 'value2 = ', value2 print *, 'sum = ', sum arrayOfFloats(1) = 4 arrayOfFloats(2) = 8 arrayOfFloats(3) = 15 arrayLength = 3 sumOfArrayElements = GetSumOfArrayElements(arrayOfFloats, arrayLength) print *, 'GetSumOfArrayElements' index = 1 do if (index.gt.arrayLength) exit print *, 'Element = ', index, 'Value = ', arrayOfFloats(index) index = index + 1 enddo print *, 'Sum = ', sumOfArrayElements print *, 'End' end program FortranExampleExe ====Вывод программы==== Fortran example Summation: value1 = 2.500000 value2 = 3.000000 sum = 5.500000 GetSumOfArrayElements Element = 1 Value = 4.000000 Element = 2 Value = 8.000000 Element = 3 Value = 15.00000 Sum = 27.00000 End