C与Fortran混合编程

news/2024/11/17 4:34:22/

混合编程

    • 1、C调Fortran:判断两个数的最大值,C输入,Fortran判断
    • 2、Fortran调C:二维数组运算,Fortran进行相关定义,C运算
    • 3、遇到的问题

1、C调Fortran:判断两个数的最大值,C输入,Fortran判断

fortran.f90

subroutine maxnum(x,y)integer :: x,yif(x > y) thenprint *, xelseprint *, yend if
end subroutine maxnum

c.c

#include<stdio.h>
void maxnum_(int*, int*);
int main(){int a,b;printf("请输入要比较的两个数\n");scanf("%d%d",&a,&b);maxnum_(&a, &b);
}
test: fortran.f90 c.cgcc -c c.c -o c.ogfortran -c fortran.f90 -o fortran.ogfortran -o test fortran.o c.o#gcc -o test c.o fortran.o

2、Fortran调C:二维数组运算,Fortran进行相关定义,C运算

fortranCallC.f90

program callCimplicit noneexternal :: sum_c       !调用C的函数 integer(kind=8),dimension(3,3) :: arrinteger :: i,ji=0j=0print *,'输入3x3的矩阵,回车隔开:'!一个二维矩阵do i = 1, 3do j =1, 3read *, arr(i,j)end do end do !调用c函数进行计算! do i = 1, 3!   do j =1, 3!       print *,arr(i,j)!   end do!end docall sum_c(arr)
end program callc  

CCallFortran.c

#include<stdio.h>void sum_c_(int arr[][3]){int sum = 0;//printf("sizeof(arr) is %ld\n",sizeof(*arr)); 查看数组所占内存,输出是12,但我输出15个数才得到全部的arr的值//相关文档没有发现,但是多次运行发现传过来的二维数组索引需要+2for(int i=0; i<=4; i+=2){for(int j=0 ;j<=4; j+=2){// printf("222222");用来检验非编译错误,上面把j++写成i++sum += *(arr[j]+i);printf("传过来的数组值:%d\n",arr[j][i]);}}printf("the sum is %d\n",sum);
}

makefile

test: CCallFortran.c fortranCallC.f90gfortran -c fortranCallC.f90 -o fortranCallC.ogcc -c CCallFortran.c -o CCallFortran.ogfortran -o test CCallFortran.o fortranCallC.o

3、遇到的问题

1、逗号写成中文状态,使用vim编辑不利于排错,也是我对这件事的反映不够,加强表征印象
2、Fortran调用c语言,二维数组运算
参考1
参考2

相互调用参考

3、C语言中 指针做函数参数传递二维数组 ,Fortran调用c的函数,需要指针作为参数,所以有了下面这些问题:
关于参数是二维数组指针的操作
我疑惑传入参数后,为什么不用*来表示变量值 参考

#include <stdio.h>
void fun(int (*p1)[3],int (*p2)[3]);
int main()
{
int p1[3][3]={{7,8,9},{4,5,6},{1,2,3}} ;
int p2[3][3] = {0};
int i = 0, j = 0;
fun(p1,p2);
for(i = 0;i < 3;i++){
for(j = 0;j < 3;j++){
printf("%d ",*(*(p2+i)+j));    
}
printf("\n");
}        
return 0;
}
void fun(int (*p1)[3],int (*p2)[3])
{
int i = 0,j = 0;
for(i = 0;i < 3;i++){
for(j = 0;j < 3;j++){
*(p2[j]+i) = *(p1[i]+j);
}
}
}

https://blog.csdn.net/hsajas/article/details/83586774

一个c语言程序中没有或一个main函数
f.f90:(.text+0x11): multiple definition of `main’

不知对错的一种写法

program mainendsubroutine maxnum(x,y) bind(c)
use,intrinsic :: iso_c_bindinginteger(kind=4) :: x,yread(*,*) x, yif(x > y) thenprint *, xelseprint *, yend if
end subroutine maxnum

记录一下,以上

4、在链接时c和frotran时出现的问题
fortran.f90:(.text+0x66): undefined reference to _gfortran_st_write' fortran.f90:(.text+0x84): undefined reference to_gfortran_transfer_integer_write’
fortran.f90:(.text+0x93): undefined reference to _gfortran_st_write_done' fortran.f90:(.text+0xd0): undefined reference to_gfortran_st_write’
fortran.f90:(.text+0xee): undefined reference to _gfortran_transfer_integer_write' fortran.f90:(.text+0xfd): undefined reference to_gfortran_st_write_done
以上使用gcc编译时出现的问题,可能是我将两个文件(c和fortran的编译文件链接时使用gcc方的顺序不对)
gcc -c c.c -o c.o
gfortran -c fortran.f90 -o fortran.o
#gfortran -o test fortran.o c.o
gcc -o test c.o fortran.o
fortran.o: In function maxnum_': fortran.f90:(.text+0x66): undefined reference to_gfortran_st_write’
fortran.f90:(.text+0x84): undefined reference to _gfortran_transfer_integer_write' fortran.f90:(.text+0x93): undefined reference to_gfortran_st_write_done’
fortran.f90:(.text+0xd0): undefined reference to _gfortran_st_write' fortran.f90:(.text+0xee): undefined reference to_gfortran_transfer_integer_write’
fortran.f90:(.text+0xfd): undefined reference to `_gfortran_st_write_done’
collect2: error: ld returned 1 exit status
makefile:2: recipe for target ‘test’ failed
make: *** [test] Error 1
使用gcc先编译c的也不行
就是要用gfortran吗?总之fortran是可以的

5、Makefile的使用记得一定要tab
混编程的最后链接最好使用gfortran别用gcc(鄙见),不然会出现一堆难以理解的错误参考

6、在fortran调用c的时候出现的错误
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
无效的内存引用

感谢
@Alex_the_Dawn
@0_382
@詹坤林
无私分享


http://www.ppmy.cn/news/598618.html

相关文章

fortran并行程序入门(1)

入门俩程序 前言一、简单并行程序&#xff1f;二、Fortran并行的一些注解1.线程通信的一些代码注解 总结 前言 今天&#xff0c;迫不得已还是要学fortran了&#xff0c;不然工作进行不下去。 一、简单并行程序&#xff1f; 本处先加载前人所写的部分代码。 program mainuse…

python调用fortran的3种形式【f2py,动态链接库,os命令】

一、f2py调用fortran 基于 F2PY&#xff0c;在 Python 中调用 Fortran 函数的基本流程是&#xff1a; Fortran 代码使用f2py编译 Fortran 代码&#xff0c;产生动态库在 Python 中通过import引入动态库 注意&#xff1a; F2py 支持有限的 Fortran 子集。 """…

关于gfortran和ifort

最近用fortran写了个程序&#xff0c;分别用gfortran和ifort进行了编译&#xff0c;却发现同样的代码&#xff0c;gfortran可以编译通过&#xff0c;而ifort出错。下面以样例程序加以说明&#xff0c;看看这两个编译器有什么小区别。 代码包括三个源文件&#xff1a;一个主程序…

macOS使用CodeRunner快速配置fortran环境

个人网站:xzajyjs.cn 由于一些项目的缘故&#xff0c;需要有fortran的需求&#xff0c;但由于是M1 mac的缘故&#xff0c;不能像windows那样直接使用vsivf这种经典配置。搜了一下网上主流的跨平台方案&#xff0c;主要是gfortran&#xff0c;最近用Coderunner&#xff08;主要…

python调用fortran学习笔记

起因&#xff1a;不想把fortran结果手动搬到excel里画图表 先在window系统试&#xff0c; 使用f2py方法的时候总是报错has fortran sources but no fortran compiler found&#xff0c;或者not supported between instances of nonetype and str。 使用dllctypes库的时候&am…

在Linux环境下,使用ifortran编译 带有结构的和.inc头文件 的fortran项目生成.so文件

在Linux环境下&#xff0c;使用ifortran编译 带有结构的和.inc头文件 的fortran项目生成.so文件 1 致谢2 参考文章和手册3 需求描述3.1 文件结构3.2 文件调用关系 4 主程序改造为函数5 项目编译方法5.1 方案一 直接对所有.f90源文件进行编译5.1.1 具体实现5.1.2 注意事项 5.2 方…

Fortran入门——菜鸟级基础语法

前言&#xff1a; 最近需要自学Fortran,本人菜鸟&#xff0c;零基础&#xff0c;这篇文章也是帮助我自己更好的记住一些基础语法。所以&#xff0c;有Fortran基础的&#xff0c;可以跳过本篇啦~ 本文的环境是mingw vscode 哈 1.后缀 Fortran文件的后缀是 .f90&#xff08;还…

Fortran编译初步

写在前面 注意&#xff1a;本文是关于 gfortran 的文章。如果你不清楚 gfortran&#xff0c;g77&#xff0c;g95 等等的概念的话&#xff0c;不妨看看GCC 的 Fortran 语言编译器介绍&#xff1b;如果你要用 g77 的话&#xff0c;这是一篇g77入门。 [编辑]Fortran 编程中相关文…