如何在Squeak FFI中处理多个指针级别(如char **)

问题描述 投票:2回答:1

我想处理这样的结构struct foo {char *name; char **fields ; size_t nfields};

如果我在吱吱声中定义相应的结构,则>

ExternalStructure subclass: #Foo 
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'FFI-Tests'.

并用天真地定义字段

Foo class>fields
    ^#(
        (name 'char*')
        (fields 'char**')
        (nfields 'unsigned long')
      )

然后用Foo defineFields生成访问器,我得到了那些未区分类型的名称和字段:

Foo>>name
    ^ExternalData fromHandle: (handle pointerAt: 1) type: ExternalType char asPointerType

Foo>>fields
    ^ExternalData fromHandle: (handle pointerAt: 5) type: ExternalType char asPointerType

这很麻烦,字段访问器缺少第二个间接访问。

我应该如何在规范中指定字段访问器?如果不可能,如何手动定义?

并且我对此HDF5函数原型有相同的问题:int H5Tget_array_dims(hid_t tid, hsize_t *dims[])

不接受以下语法:

H5Tget_array_dims: tid with: dims
    <cdecl: long 'H5Tget_array_dims'(Hid_t  Hsize_t * * )>

编译器在第二个argument expected ->之前吠叫* ...我改为求助于void *,这完全绕过了类型检查-不太理想...

任何想法如何正确处理此类原型?

我想处理类似struct foo {char * name; char ** fields; size_t nfields};如果我在Squeak ExternalStructure子类中定义了相应的结构:#Foo ...

smalltalk ffi squeak
1个回答
0
投票

自从Compiler-mt.435起,解析器将不再抱怨,而是回调到ExternalType>>asPointerToPointerType。参见source.squeak.org/trunk/Compiler-mt.435.diffsource.squeak.org/FFI/FFI-Kernel-mt.96.diff

© www.soinside.com 2019 - 2024. All rights reserved.