- 积分
- 579
- 明经币
- 个
- 注册时间
- 2022-4-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2023-4-8 11:11:12
|
显示全部楼层
多维安全数组完全看懵了
一维数组很好理解 多维数组就完全无法理解了
例如
(setq sa (vlax-make-safearray vlax-vbLong '(0 . 3)))
(setq va (vlax-make-variant sa))
(setq vl (vlax-safearray->list(vlax-variant-value va)))
查看lv的值为(0 0 0 0),很容易理解:上面代码创建的一维安全数组,索引值从0到3,所以vl值是四个元素表.
但是当改成下面这样的二维数组时
(setq sa (vlax-make-safearray vlax-vbLong '(0 . 3)'(1 . 2)))
(setq va (vlax-make-variant sa))
(setq vl (vlax-safearray->list(vlax-variant-value va)))
查看vl的值为: ((0 0) (0 0) (0 0) (0 0)),这就懵逼了,这是怎么来的.
另外,像楼主例子中
(setq dblarray (vlax-make-safearray vlax-vbDouble ‘(0 . 3)))
(vlax-make-variant dblarray :vlax-vbArray)
这样创建安全数组类型的变体时, :vlax-vbArray 数据类型前面带个冒号的写法, :vlax-vbArray 的枚举值是nil,并不是常量 这个写法貌似是错的,但代码是没有报错的,原因应该是该数据类型枚举值为nil,所以代码认为是相当于省略了,所以代码按自动匹配机制自动匹配了相应的安全数组的数据类型,所以:vlax-vbArray这个存在是没意义的,但是把前面的冒号去掉后,vlax-vbArray是有枚举值的(8192),但是这样创建的话,代码会报错:此类型的 LISP 值不能强制转换成 VARIANT: #<safearray...>,这是为何? 是不是创建安全数组类型的变体时,不需要表明创建变体的数据类型呢? |
|