我想处理这样的结构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 ...
自从Compiler-mt.435起,解析器将不再抱怨,而是回调到ExternalType>>asPointerToPointerType
。参见source.squeak.org/trunk/Compiler-mt.435.diff和source.squeak.org/FFI/FFI-Kernel-mt.96.diff