Пример вызова функций статической библиотеки, написанной на языке C++, из программы, написанной на языке Fortran-90 посредством интерфейса.
Система, в которой тестировался данный пример: Windows.
Программа состоит из:
FortranExampleLib.lib
;FortranExampleExe.exe
, к которой эта библиотека линкуется.Статическая библиотека, написанная на языке C++.
Использовались:
В настройка проекта выставлено:
Конфигурация | Настройки |
---|---|
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; }
Программа на языке Fortran-90.
Использовались:
В настройках проекта выставлено:
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