Fortran Coder

查看: 12488|回复: 6
打印 上一主题 下一主题

[混编] fortran的空指针问题(调用C函数)

[复制链接]

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
跳转到指定楼层
楼主
发表于 2015-8-28 19:22:28 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 安靖 于 2015-8-29 21:58 编辑

在fortran中调用c的函数,其中有参数应为NULL值。我在fortran中用的是内置函数NULL(),但是发现在传到c里就变成0,何解?
以下为c/c++中对NULL的定义
[C] 纯文本查看 复制代码
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif



fortran中NULL()应该是使指针未关联,而不是所谓的空指针。

我猜测就是这个原因。 那么问题来了,怎么解决呢?
是否可以这样
在fortran中声明变量,调用C使变量地址为NULL,然后再将声明的变量所谓参数传给C的函数呢

我是在调用metis库的时候遇到的这个问题,我暂时的解决办法是直接修改metis(C函数),已经满足我现在的需求了。
那现在我把测试代码贴出来,看看有没有不用修改metis的方法,顺便大家讨论学习。
附件为测试代码以及用到的metis库(版本为5.1.0)

[Fortran] 纯文本查看 复制代码
program main
        implicit none
        integer,parameter :: nvtxs=15,Edges=22
        integer :: xadj(nvtxs+1),adjncy(2*Edges)
        integer :: part(nvtxs)
        integer :: npart = 2
        !***********metis 4.0.1***********
        integer :: option(5) = [ 0, 0, 0, 0, 0 ]
        integer :: edgecut
        integer :: wgtflag = 0
        integer :: numflag = 1
        integer :: vwgt, adjwgt
        !***********metis 5.1.0************
        integer :: ncon =1
        integer :: options(40)
        integer :: objval
        
        !**********Graph Data**************
        xadj=[0, 2, 5, 8, 11, 13, 16, 20, 24, 28, 31, 33, 36, 39, 42, 44]
        adjncy=[1, 5, 0, 2, 6, 1, 3, 7, 2, 4, 8, 3, 9, 0, 6, 10, 1, 5, 7, 11, 2, 6, 8, 12, 3, 7, 9, 13, 4, 8, 14, 5, 11, 6, 10, 12, 7, 11, 13, 8, 12, 14, 9, 13]
!***********metis 4.0.1***********
!参数vwgt,adjwgt等传0值进去就行了。
!        call METIS_PartGraphRecursive(nvtxs,xadj,adjncy,vwgt,adjwgt,wgtflag,numflag,npart,option, edgecut, part)   

        !***********metis 5.1.0************
!会提示错误。原因是参数NULL()在c中(NULL()==NULL)不成立
        call METIS_SetDefaultOptions(options)
        options(18) =1
        call METIS_PartGraphRecursive(nvtxs,ncon,xadj,adjncy,NULL(), NULL(), NULL(), npart, &
         & NULL(), NULL(), options,objval,part)
        write(*,*) '**********************'
        write(*,*) part
        write(*,*) '**********************'
end program main


makefile
[Make] 纯文本查看 复制代码
TARGET  = test.out
GC        = ifort
CFLAGS  = -fpp -g 
SOR        = metis_test.f90
OBJS        = metis_test.o
LIBS    = ~/lib/libmetis.a
$(OBJS):
        @echo "-----------------------------------"
        @echo "Compiling..."
        @echo "-----------------------------------"
        @$(GC) $(CFLAGS) -c $(SOR) $(INCLUDE)
        @echo "-----------------------------------"
        @echo "Linking..."
        @echo "-----------------------------------"
        @$(GC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
        @echo "-----------------------------------"
        @echo "Deleting OBJ files..."
        @echo "-----------------------------------"
        @rm -fr *.o 
        @echo "-----------------------------------"
clean:
        @rm -fr *.o 
        @rm -fr $(TARGET)








metis_test.f90

1.07 KB, 下载次数: 0

测试代码

libmetis-5.1.0.tar

650 KB, 下载次数: 0

metis5.1.0库

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
沙发
 楼主| 发表于 2015-8-29 10:06:33 | 显示全部楼层
fcode 发表于 2015-8-29 08:49
在我的编译器上。这俩是一样的。NULL() 与空指针。
实际上呢,一块内存,或一个地址,只有 2**N 种可能(N ...

谢谢回复
我的fortran编译器是ifort版本是11.0,c语言编译器是gcc4.6.3
把fortran的NULL()传到c里后

NULL()不等于NULL
不知道你用什么编译器?

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
板凳
 楼主| 发表于 2015-9-2 16:24:06 | 显示全部楼层
jason388 发表于 2015-9-2 13:11
Fortran与C混合编程应该采用5楼pasuka这种方式。Fortran的c_null_ptr对应C的null指针,因此在C函数中使用nu ...

metis库已经给出了fortran接口了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-6 20:06

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表