Объединяя различную информацию в комментариях и других ответах, я думаю, минимально модифицированная версия исходного кода может выглядеть следующим образом:
fortsub.f90
subroutine fireballess(ear, ne, parames, ifl, photar, photer)
implicit none
integer ne, ifl
real*4 ear(0:ne), parames(10), photar(ne), photer(ne)
print *, "ear = ", ear
print *, "ne = ", ne
print *, "parames = ", parames
print *, "ifl = ", ifl
print *, "photar = ", photar
print *, "photer = ", photer
print *
print *, "sizeof(integer) = ", sizeof(ne)
print *, "sizeof(real*4) = ", sizeof(ear(1))
end
main.cpp
#include <iostream>
extern "C"
void fireballess_( float *ear, int *ne, float *parames,
int *ifl, float *photar, float *photer );
int main()
{
std::cout << "sizeof(int) = " << sizeof(int) << std::endl;
std::cout << "sizeof(float) = " << sizeof(float) << std::endl;
int ne = 3, ifl = 2;
float *ear = new float[ne + 1] { 0.0f, 20.0f, 40.0f, 60.0f };
float *parames = new float[10]
{ 0.1f, 0.2f, 0.3f, 0.4f, 0.5f,
0.6f, 0.7f, 0.8f, 0.9f, 1.0f };
float *photar = new float[ne] { 1.0f, 2.0f, 3.0f };
float *photer = new float[ne] { 4.0f, 5.0f, 6.0f };
fireballess_( ear, &ne, parames, &ifl, photar, photer );
delete[] ear;
delete[] parames;
delete[] photar;
delete[] photer;
}
Здесь модифицированные части: (1) real*4
в Фортране обычно соответствует float
в C ++; (2) нам нужно передать адрес фактических аргументов (особенно для ne
и ifl
); и (3) ear
должен иметь ne + 1
элементов, потому что он определен как ear(0:ne)
на стороне Фортрана. Затем, компилируя коды как
$ gfortran-8 -c fortsub.f90
$ g++-8 main.cpp fortsub.o -lgfortran
дает (с GCC8 + MacOS10.13)
sizeof(int) = 4
sizeof(float) = 4
ear = 0.00000000 20.0000000 40.0000000 60.0000000
ne = 3
parames = 0.100000001 0.200000003 0.300000012 0.400000006 0.500000000 0.600000024 0.699999988 0.800000012 0.899999976 1.00000000
ifl = 2
photar = 1.00000000 2.00000000 3.00000000
photer = 4.00000000 5.00000000 6.00000000
sizeof(integer) = 4
sizeof(real*4) = 4
Если мы используем std::vector
, соответствующий код может выглядеть следующим образом (при просмотре некоторых руководств по std::vector
...)
// main2.cpp
#include <iostream>
#include <vector>
extern "C"
void fireballess_( float *ear, int *ne, float *parames,
int *ifl, float *photar, float *photer );
using Vecf = std::vector<float>;
int main()
{
int ne = 3, ifl = 2;
Vecf ear { 0.0f, 20.0f, 40.0f, 60.0f };
Vecf parames { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f,
0.6f, 0.7f, 0.8f, 0.9f, 1.0f };
Vecf photar { 1.0f, 2.0f, 3.0f };
Vecf photer { 4.0f, 5.0f, 6.0f };
fireballess_( ear.data(), &ne, parames.data(),
&ifl, photar.data(), photer.data() );
}
, который, кажется, дает тот же результат (заменив main.cpp
на main2.cpp
).