Содержание

Вызов функций C++ из Fortran-90

Пример вызова функций статической библиотеки, написанной на языке C++, из программы, написанной на языке Fortran-90 посредством интерфейса.

Пример программы FortranExample

Система, в которой тестировался данный пример: Windows.

Структура программы

Программа состоит из:

FortranExampleLib.lib

Статическая библиотека, написанная на языке 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)
FortranExampleLib.h
#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
FortranExampleLib.cpp
#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.

Использовались:

В настройках проекта выставлено:

LibInterface.f90
	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
FortranExampleExe.f90
	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

Вывод программы

FortranExampleOutput.txt
 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