Fortran Coder

查看: 156|回复: 8

[混编] logical(c_bool)怎么用?

[复制链接]

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
425 元
贡献
262 点
发表于 2020-7-9 01:42:17 | 显示全部楼层 |阅读模式
Fortran调用C

如何传递逻辑变量?


回复

使用道具 举报

546

帖子

1

主题

0

精华

大宗师

F 币
2702 元
贡献
1721 点
发表于 2020-7-9 09:43:13 | 显示全部楼层
c没有逻辑型,用整型。

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
425 元
贡献
262 点
 楼主| 发表于 2020-7-9 11:42:18 | 显示全部楼层
li913 发表于 2020-7-9 09:43
c没有逻辑型,用整型。

_Bool算不算?确实可以用整形,但内心不爽

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
425 元
贡献
262 点
 楼主| 发表于 2020-7-9 12:53:29 | 显示全部楼层
换个角度请教各位一句,关于.false.的编码,有多少厂商设的不是0?

546

帖子

1

主题

0

精华

大宗师

F 币
2702 元
贡献
1721 点
发表于 2020-7-9 16:49:26 | 显示全部楼层
lookbook 发表于 2020-7-9 12:53
换个角度请教各位一句,关于.false.的编码,有多少厂商设的不是0?

false不是0的情况,没见过。

546

帖子

1

主题

0

精华

大宗师

F 币
2702 元
贡献
1721 点
发表于 2020-7-9 16:50:29 | 显示全部楼层
lookbook 发表于 2020-7-9 12:53
换个角度请教各位一句,关于.false.的编码,有多少厂商设的不是0?

false不是0的情况,没见过。

835

帖子

0

主题

0

精华

宗师

F 币
1331 元
贡献
744 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2020-7-9 18:20:15 | 显示全部楼层
false 通常都是0,但 true 不一定是 1,可能是-1,或者其他非零值。

目前没有标准的方法来统一 bool(c) 和 Logical(fortran),建议用 int 或 short 代替。

116

帖子

8

主题

0

精华

版主

F 币
557 元
贡献
336 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

发表于 2020-7-9 23:42:05 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
PROGRAM test                                                                              
  USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_BOOL                                           
                                                                                          
  LOGICAL*1  :: byte_1_logical  ! kind of 1-byte                                          
  LOGICAL(1) :: kind_1_logical  ! kind number is 1                                        
  LOGICAL    :: default_logical ! default kind                                            
                                                                                          
  WRITE(*,*) C_BOOL !---> 1-byte                                                          
                                                                                          
  ! report the kind nunmbes                                                               
  WRITE(*,*) KIND(byte_1_logical)                                                         
  WRITE(*,*) KIND(kind_1_logical)                                                         
  WRITE(*,*) KIND(default_logical)                                                        
                                                                                          
  ! Many compilers support 1-, 2- 4- 8-byte LOGICALs                                      
  ! kind numbers may be (1,2,3,4) or (1,2,4,8), compiler-time-switch dependent            
                                                                                          
END PROGRAM test                                                                          

116

帖子

8

主题

0

精华

版主

F 币
557 元
贡献
336 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

发表于 2020-7-10 22:04:17 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
FUNCTION f(a, b)                                                
  IMPLICIT NONE                                                 
  LOGICAL, INTENT(IN   ) :: a                                   
  LOGICAL, INTENT(  OUT) :: b                                   
  LOGICAL                :: f                                   
                                                                
  INTERFACE ! [C] bool c(bool a, bool *b)                       
    FUNCTION c(a, b) BIND(C,NAME='c')                           
      USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_BOOL             
      IMPLICIT NONE                                             
      LOGICAL(C_BOOL), VALUE :: a                               
      LOGICAL(C_BOOL)        :: b                               
    END FUNCTION c                                              
  END INTERFACE                                                 
                                                                
  LOGICAL(C_BOOL) :: bb                                         
                                                                
  !---------------                                              
                                                                
  f = c(LOGICAL(a,KIND=C_BOOL), bb)                             
                                                                
  b = bb                                                        
                                                                
  ! there should be no problem: assign "1-byte" to "4-byte"     
                                                                
END FUNCTION f                                                  
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-8-14 21:28

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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