是否有官方方法将通过引用传递的参数转换为指向完全相同类型的指针?我知道在编译的CodeGen阶段ref int
变为int *
,我知道你可以用extern来实现C互操作性,但是为了编写Chapel怎么样?抽象?那么,广泛引用和广泛指针的情况呢?你会怎么处理这样的事情。
对于那些好奇的人,我试验了一些PGAS-STM(分区全局地址空间 - 软件事务存储器),我需要做的一件事就是允许语义如下......
使用STM预先列出:
// Global variables
var head : node(eltType);
// Local variables
var newHead = new node(eltType);
var retry = false;
var stm = manager.getDescriptor();
do {
retry = false;
try! {
stm.begin();
// Takes pointer of 'head' via its reference...
// What happens if its a wide reference???
var h = stm.read(head);
newHead.next = h;
stm.write(head, nextHead);
stm.commit();
} catch retry : STMRetry {
retry = true;
}
} while retry;
是的,它目前很难看,但它是一个非常早期的原型。
修改:将STMBegin
的命名更改为begin
答案 0 :(得分:3)
是否有官方方法将通过引用传递的参数转换为指向完全相同类型的指针?
我不知道“官方”,但我的直觉是尝试使用c_ptrTo
,如下所示,这似乎与Chapel 1.16一样。鉴于这些文件:
testit.chpl:
extern proc bar(x: c_ptr(int));
require "testit.h";
var i = 42;
foo(i);
writeln("after foo, i is: ", i);
proc foo(ref x: int) {
var c_ptr_to_x: c_ptr(int) = c_ptrTo(x);
bar(c_ptr_to_x);
writeln("after bar, x is: ", x);
x = 22;
}
testit.h:
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
static void bar(int64_t* x) {
printf("bar got: %"PRId64"\n", *x);
*x = 32;
}
结果似乎像我希望的那样有效:
$ chpl testit.chpl
$ ./testit
bar got: 42
after bar, x is: 32
after foo, i is: 22
为了编写Chapel抽象怎么样?
我认为c_ptr()
类型实际上只是为了与C的互操作性,而不是在Chapel本身内编写基于指针的抽象的方法。
此外,广泛引用和广泛指针的情况如何?
这些是实现概念,而不是在语言层面向最终用户公开的抽象,所以我不确定在Chapel中是否有规定的用户级方法来处理这些类型。