gpt4 book ai didi

c - .C() 返回一个空列表

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:21 25 4
gpt4 key购买 nike

我是 R 的初学者,我正在尝试将用 C 编写的名为 dll.dll.dll 文件加载到 R 中。它似乎有效,现在我想使用存储在 .dll 文件中的函数,但我遇到了问题。

我在此处和谷歌上的手册中搜索了解决方案或其他方法。如果我能得到有关使用什么或任何想法的建议,将不胜感激!

我的代码:

setwd("C:/Users/MyUser/R")
dyn.load("dll.dll")
is.loaded("DLL_FUNK")
# For some reason True with capital letters, not in lower case
output <- .C("DLL_FUNK", in9 = as.integer(7))
#output # R Crashes before I can write this.
# R Crashes
# In outdata.txt: "in-value= 139375128"

该函数应返回一个数字 1955。但我似乎无法获得该值。我究竟做错了什么?

更新代码(Fortran 以 C 运行),这是 dll.dll 中的代码:

subroutine  dll_funk(in9) 
implicit none

!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!*** Declarations: variables, functions
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
integer(4) :: in9
!integer :: in9


! Definitions of variables in the external function calls
!!dec$ attributes c,alias :'dll_funk' :: dll_funk
!dec$ attributes dllexport :: dll_funk
!dec$ attributes value :: in9

open(194,file='outdata.txt')
write(194,*) 'in-value=', in9
! in9 = 1955
close(194)

end subroutine
!end function

所以现在当它运行时,R 崩溃了,但在它写入我的文件 (outdata.txt) 之前,但它不是我的号码,可能是某种地址......

另一个问题,您是建议我使用 .C 运行代码,然后从 C 运行 Fortran 代码,还是使用 .Fortran 运行代码更好,仅使用 Fortran 代码?似乎 .Fortran 在处理字符串时遇到问题,或者这就是我从以下内容中了解到的:Interface func .C and .Fortran

最佳答案

为什么不向 C 函数 dll_function 传递任何参数?当您使用 .C() 时,您必须将函数参数作为列表传递。 .C() 将返回修改后的列表。所以,如果您什么都不传入,您将一无所获。

您的 C 函数 dll_function 是什么样的?请注意:

  1. dll_function 必须是 void C 函数,没有返回值。如果这个函数应该返回一些东西,它必须通过修改函数参数返回;
  2. dll_function 的所有函数参数必须是指针。

跟进

The dll_function is only to test if I can get access to it.

可以在dyn.load()之后使用is.loaded()来测试是否可以访问C函数:

dyn.load("dll.dll")
is.loaded("dll_function") ## TRUE

请注意,is.loaded 采用 C 函数名称,而 dyn.load() 采用 .dll 名称。通常,您可以在单个 .dll 文件中包含多个函数。您可以使用 is.loaded() 来检查它们中的任何一个,以测试是否已成功加载共享库。

So if I want it to return something, I should give it an argument (of same type?)?

是的。这里的另一个答案确实给出了一个玩具示例。你可以看看this answer我半个月前做的。底部是变量类型的摘要。

关于c - .C() 返回一个空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37961219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com