Julia调用C和Fortran代码.pdf

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Julia调用C和Fortran代码

Julia 调⽤ C 和 Fortran 代码 调⽤ C 和 Fortran 代码 Julia 调⽤ C 和 Fortran 的函数,既简单又⾼效。 被调⽤的代码应该是共享库的格式。⼤多数 C 和 Fortran 库都已经被编译为共享库。 如果⾃⼰使⽤ GCC ( Clang )编译代码,需要添加 -shared 和 -fPIC 选项。 Julia 调⽤这些库的开销与本地 C 语⾔相同。 调⽤共享库和函数时使⽤多元组形式: (:function, library) (function, library) ,其中 function 是 C 的导出函数名, library 是 共享库名。共享库依据名字来解析,路径由环境变量来确定,有时需要直接指明。 多元组内有时仅有函数名 (仅 :function function )。此时,函数名由当 前进程解析。这种形式可以⽤来调⽤ C 库函数, Julia 运⾏时函数,及链接到 Julia 的 应⽤中的函数。 使⽤ ccall 来⽣成库函数调⽤。 ccall 的参数如下: 1. (:function , library) 多元组对⼉ (必须为常量,详见下⾯) 2. 返回类型,可以为任意的位类型,包括 Int32 , Int64 , Float64 , 者 指向任意类型参数 的指针 Ptr{ } , 者仅仅是指向⽆类型指针 void* 的 Ptr 3. 输⼊的类型的多元组,与上述的返回类型的要求类似。输⼊必须是多元组,⽽ 不是值为多元组的变量 表达式 4 . 后⾯的参数,如果有的话,都是被调⽤函数的实参 下例调⽤标准 C 库中的 clock : julia t = ccall( (:clock, libc), Int32, ()) 2292761 julia t 2292761 julia typeof(ans) Int32 clock 函数没有参数,返回 Int32 类型。输⼊的类型如果只有⼀个,常写成⼀元多 元组,在后⾯跟⼀逗号。例如要调⽤ getenv 函数取得指向⼀个环境变量的指针,应 这样调⽤: julia path = ccall( (:getenv, libc), Ptr{Uint8}, (Ptr{Uint8 Ptr{Uint8} @0x00007fff5fbffc45 julia bytestring(path) /bin/bash 注意,类型多元组的参数必须写成 (Ptr{Uint8},) ,⽽不是 (Ptr{Uint8}) 。这 是因为 (Ptr{Uint8}) 等价于 Ptr{Uint8} ,它并不是⼀个包含 Ptr{Uint8} 的 ⼀元多元组: julia (Ptr{Uint8}) Ptr{Uint8} julia (Ptr{Uint8},) (Ptr{Uint8},) 实际中要提供可复⽤代码时,通常要使⽤ Julia 的函数来封装 ccall ,设置参数,然 后检查 C Fortran 函数中可能出现的任何错误,将其作为异常传递给 Julia 的函数调 ⽤者。下例中, getenv C 库函数被封装在 env .jl ⾥的 Julia 函数中: function getenv(var::String) val = ccall( (:getenv, libc), Ptr{Uint8}, (Ptr{Uint8},), var) if val == C_NULL error(getenv : undefined variable: , var) end bytestring(val) end 上例中,如果函数调⽤者试图读取⼀个不存在的环境变量,封装将抛出异常: julia getenv(SHELL) /bin/bash julia getenv(FOOBAR) getenv : undefined variable: FOOBAR 下例稍复杂些,显⽰本地机器的主机名: function gethostname()

文档评论(0)

wnqwwy20 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档