C++如何调用Fortran 77的公共块
How C++ call Fortran 77's common blocks
我刚接触编程,我想在我的 C++ 代码中调用 Fortran 77 公共块。其实我看过一些类似我的问答,但是我不是很清楚....
此公共块由另一个 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()
,我应该怎么做?
请注意,C 中的二维数组是 row-major whereas in FORTRAN they are column-major,因此您需要在一种语言或另一种语言中切换数组索引。
除了 row/column-major 顺序问题(5x5 矩阵会出现在 C 代码中的转置)之外,也许您可以按以下方式进行(请参阅此 tutorial 中有关公共块的部分):
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
我刚接触编程,我想在我的 C++ 代码中调用 Fortran 77 公共块。其实我看过一些类似我的问答,但是我不是很清楚....
此公共块由另一个 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()
,我应该怎么做?
请注意,C 中的二维数组是 row-major whereas in FORTRAN they are column-major,因此您需要在一种语言或另一种语言中切换数组索引。
除了 row/column-major 顺序问题(5x5 矩阵会出现在 C 代码中的转置)之外,也许您可以按以下方式进行(请参阅此 tutorial 中有关公共块的部分):
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