是否有官方方法可以通过引用传递的参数转换为指针以转换为完全相同的类型?我知道在编译的 CodeGen 阶段,ref int
变得int *
,我知道你可以为了 C 互操作性而使用 extern 这样做,但是为了编写 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
是否有官方方法可以通过引用传递的参数转换为完全相同类型的指针?
我不知道"官方",但我的直觉是尝试按如下方式使用c_ptrTo
,这似乎在教堂 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
为了写教堂抽象呢?
我认为c_ptr()
类型实际上只是为了与 C 的互操作性,而不是作为在 Chapel 本身中编写基于指针的抽象的一种手段。
此外,宽引用和宽指针的情况如何?
这些是在语言级别向最终用户公开的实现概念,而不是抽象,因此我不确定是否有规定的用户级方法来在Chapel中使用这些类型。