【发布时间】:2018-04-11 21:10:35
【问题描述】:
我必须处理具有这种定义的外部库struct foo {float *data; size_t len;};
首先我在Squeak中定义了相应的结构
ExternalStructure subclass: #Foo
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'FFI-Tests'.
那么 Squeak FFI 可以处理不同的指针大小。
我知道我必须通过Foo defineFields 重新生成字段访问权限。
但这是我可以在包加载 postscript 中处理的事情。
不幸的是,Squeak FFI 中没有 size_t 支持。在我想支持的平台上,我知道它将是 uint32_t 和 uint64_t,它们在 Squeak FFI 中分别转换为 unsigned long 和 unsigned long long(从 Squeak 图像大小来看,这些类型是固定大小的)。
那我该怎么办?对 Foo 有两种不同的定义(但我必须使用 foo 复制所有类型,并使用 foo 复制原型的接口)
Foo32 class>fields
^#(
(data 'float*')
(len 'ulong')
)
Foo64 class>fields
^#(
(data 'float*')
(len 'ulonglong')
)
或者有没有其他解决方案(例如手动定义字段/偏移量/字节大小Smalltalk wordSize=4 ifTrue: [] ifFalse: [])?
【问题讨论】: