2

是否有官方方法可以将通过引用传递的参数转换为指向完全相同类型的指针?我知道在编译的 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;

是的,它目前很丑,但它是一个非常早期的原型。

编辑:更改命名STMBeginbegin

4

1 回答 1

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 中是否有规定的用户级别的方式来处理这些类型。

于 2018-03-08T17:41:10.490 回答