- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一些 Fortran 代码(在这个项目之前我从未使用过它......)并且遇到了一个问题。我需要与另一个程序共享一些内存空间。为了让 Fortran 识别每个内存块,我使用以下代码:
do 10 i = 0, 5
CALL C_F_POINTER(TRANSFER(memory_location +
: VarNamesLoc_(i),
: memory_location_cptr) , VarNames_(i), [3])
exit
10 continue
地点:
VarLoc(i) 是一个表示内存位置的整数
VarNames(i) ?指针数组的数组?
我遇到的问题是创建指针数组的 VarNames 数组。我从谷歌搜索中找到了一些示例代码,但我发现 Fortran 很难理解!!谁能告诉我如何设置指针数组的数组?或者,如果我处理问题的方式不正确,请指出替代方案?
作为引用,Fortran 代码以自由形式编写并使用了英特尔编译器
感谢您的帮助!
最佳答案
好的,所以我假设冒号与续行有关并忽略它们,而您正在尝试这样做:
do i = 0, 5
CALL C_F_POINTER(&
TRANSFER(memory_location + VarNamesLoc_(i), memory_location_cptr), &
VarNames_(i), [3] )
enddo
这是在做什么:(TRANSFER)取一个表示现有 C 指针的整数(我假设)memory_location
,向其添加一个偏移量(VarNamesLoc_(i)
), 并将其转换为 c_ptr
类型。然后(C_F_POINTER)将其转换为形状 [3] 的 Fortran 指针。
我不认为在 Fortran 端进行 C 指针运算是个好主意,但是。
因此,您希望 VarNames_
成为一个包含 5 个指针的数组,这些指针指向 3.. 一些东西,您没有说。比方说整数。
让我们从简单的案例来看:假设我们在 C 语言中有一个一维整数数组,并且想要在 Fortran 语言中指向它们的指针。如果我们的 C 例程是这样的 (croutine.c
):
#include <stdio.h>
#include <stdlib.h>
void makearray(int **data, int n) {
*data = (int *)malloc(n * sizeof(int));
for (int i=0; i<n; i++)
(*data)[i] = i;
return;
}
void freearray(int **data, int n) {
free(*data);
return;
}
我们的 Fortran 驱动程序可能如下所示 (driver.f90):
PROGRAM interoptesting
USE, intrinsic :: iso_c_binding
USE, intrinsic :: iso_fortran_env
IMPLICIT NONE
INTERFACE
!! C prototype: void makearray(int **data, int n)
SUBROUTINE makearray(data, n) BIND(C)
USE, intrinsic :: iso_c_binding
type(c_ptr) :: data
integer(kind=c_int), value :: n
END SUBROUTINE makearray
!! C prototype: void freearray(int **data, int n)
SUBROUTINE freearray(data, n) BIND(C)
USE, intrinsic :: iso_c_binding
type(c_ptr) :: data
integer(kind=c_int), value :: n
END SUBROUTINE freearray
END INTERFACE
type(c_ptr) :: cdata
integer, pointer, dimension(:) :: fdata
integer :: n = 5
call makearray(cdata, n);
call c_f_pointer(cdata, fdata, [n])
print *, 'fdata = ', fdata
call freearray(cdata, n)
END program
和这样的 Makefile:
FC=gfortran
CC=gcc
CFLAGS=-std=c99 -g
FFLAGS=-g
main: driver.o croutine.o
$(FC) -o $@ $^
driver.o: driver.f90
$(FC) $(FFLAGS) -c $<
clean:
rm -rf main driver.o croutine.o
然后构建并运行它,我们得到了预期的答案:
$ ./main
fdata = 0 1 2 3 4
请注意,在 C 中,我们分配了一个包含 5 个整数的数组; Fortran 程序主要定义 C 例程的接口(interface),因此我们可以从 Fortran 调用它们,然后调用它们。 c_f_pointer
在 c 指针 (cdata
) 和 Fortran 指针 (fdata
) 之间进行转换。
如果我们想在 Fortran 中做一些 C 指针运算,我们可以这样做:
type(c_ptr) :: cdata, newdata
integer(kind=int64) :: tmpint
integer, pointer, dimension(:) :: fdata
integer :: n = 5
integer(kind=c_int) :: cint
call makearray(cdata, n);
! copy pointer to an int
tmpint = TRANSFER(cdata, tmpint)
! add two integer sizes:
tmpint = tmpint + 2*c_sizeof(cint)
! copy back into a pointer
newdata= TRANSFER(tmpint, newdata)
call c_f_pointer(newdata, fdata, [n-2])
print *, 'fdata = ', fdata
call freearray(cdata, n)
但我真的不推荐这个;最好在 Fortran 中进行指针操作:
type(c_ptr) :: cdata
integer, pointer, dimension(:) :: fdata, newfdata
integer :: n = 5
call makearray(cdata, n);
call c_f_pointer(cdata, fdata, [n])
newfdata => fdata(3:n)
print *, 'newfdata = ', newfdata
call freearray(cdata, n)
更干净,不太可能导致奇怪的错误,也更小!
好的,最后,让我们做一个指针数组。诚然,这比在 Fortran 中应该做的要难,因为 Fortran 不容易让您定义指针数组;您必须创建一个已定义的类型(Fortran 相当于 C 中的结构)。但这很容易。让我们按照我推荐的方式做事,在 Fortran 端进行指针数学运算:
type(c_ptr) :: cdata
integer, pointer, dimension(:) :: fdata
integer :: n = 10
integer, parameter :: nptrs = 5
integer :: i, intsperptr, istart, iend
! our new "ptrelement" type which we can define arrays of
type ptrelement
integer, pointer, dimension(:) :: p
end type ptrelement
type(ptrelement) :: ptrs(nptrs)
call makearray(cdata, n);
call c_f_pointer(cdata, fdata, [n])
intsperptr = n/nptrs
do i=1,nptrs
istart = (i-1)*intsperptr+1
iend = istart + intsperptr-1
ptrs(i)%p => fdata(istart:iend)
enddo
do i=1,nptrs
print '(A,I2,A,99(I5,X))', 'ptrs(',i,')%p = ', ptrs(i)%p
enddo
call freearray(cdata, n)
这里我们创建了一个 ptrelelment
类型,它是一个一维指针数组,然后创建了一个数组。这为我们提供了指针数组,我们通过获取 fdata
的切片来设置它,它仍然是指向整个数据的指针。
运行给了我们
$ ./main
ptrs( 1)%p = 0 1
ptrs( 2)%p = 2 3
ptrs( 3)%p = 4 5
ptrs( 4)%p = 6 7
ptrs( 5)%p = 8 9
或者,正如我不建议的那样,在 Fortran 中进行 C 风格的指针数学运算:
type(c_ptr) :: cdata
integer :: n = 10
integer, parameter :: nptrs = 5
integer :: i, intsperptr
integer(kind=c_int) :: cint
integer(kind=int64) :: cdata_as_int
! our new "ptrelement" type which we can define arrays of
type ptrelement
integer, pointer, dimension(:) :: p
end type ptrelement
type(ptrelement) :: ptrs(nptrs)
call makearray(cdata, n);
cdata_as_int = TRANSFER(cdata, cdata_as_int)
intsperptr = n/nptrs
do i=1,nptrs
call c_f_pointer( &
TRANSFER(cdata_as_int + (i-1)*intsperptr*c_sizeof(cint), cdata),&
ptrs(i)%p, [intsperptr] )
enddo
do i=1,nptrs
print '(A,I2,A,99(I5,X))', 'ptrs(',i,')%p = ', ptrs(i)%p
enddo
call freearray(cdata, n)
关于arrays - Fortran:指针数组数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6998995/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!