gcc — как C ++ вызывает общие блоки Fortran 77

Я новичок в программировании и хочу вызвать общий блок Fortran 77 в моем коде C ++. На самом деле я прочитал некоторые вопросы&Похоже на мое, но мне было не очень понятно ….

Этот общий блок определяется другой подпрограммой Fortran 77.

Пример кода:

common.inc:

!test common block:
real delta(5,5)
common /test/ delta
!save /test/ delta  ! any differences if I comment this line?

tstfunc.f

subroutine tstfunc()
implicit none
include 'common.inc'
integer i,j
do i = 1, 5
do j = 1, 5
delta(i,j)=2
if(i.ne.j) delta(i,j)=0
write (*,*) delta(i,j)
end do
end do
end

tst01.cpp

#include <iostream>

extern "C"{
void tstfunc_();
};

void printmtrx(float (&a)[5][5]){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
std::cout<<a[j][i]<<'\t';
a[j][i]+=2;
}
std::cout<<std::endl;
}
}

int main()
{
//start...
tstfunc_();
printmtrx(delta);//here i want to call delta and manipulate it.
return 0;
}

Если я хочу пройти delta (из common.inc) в функцию C ++ printmtrx(), что я должен делать?

-1

Решение

Помимо проблемы порядка строк / столбцов (матрица 5×5 будет отображаться транспонированной в C-коде), возможно, вы могли бы действовать следующим образом (см. Раздел «Общие блоки» руководство):

tstfunc1.f

  subroutine tstfunc()
implicit none
real delta(5, 5)
common /test/ delta
integer i,j
do i = 1, 5
do j = 1, 5
delta(i,j)=2
if(i.ne.j) delta(i,j)=0
write (*,*) delta(i,j)
end do
end do
end

tst01.cc

#include <iostream>

extern "C" {
void tstfunc_();
extern struct{
float data[5][5];
} test_;
}

void printmtrx(float (&a)[5][5]){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
std::cout << a[i][j] << '\t';
a[i][j] += 2;
}
std::cout << std::endl;
}
}

int main()
{
//start...
tstfunc_();

printmtrx(test_.data);//here i want to call delta and manipulate it.
return 0;
}

Затем для того, чтобы скомпилировать:

gfortran -c -o tstfunc1.o tstfunc1.f
g++ -o tst tst01.cc tstfunc1.o -lgfortran
1

Другие решения

Обратите внимание, что двумерные массивы в C рядные основнымы тогда как в Фортране они столбцам, поэтому вам нужно переключать индексы вашего массива на один язык или другой.

1

По вопросам рекламы [email protected]