======Вызов функций 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