You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Vector2列表创建C数组并传入DrawLineStrip函数?

解决Racket中Vector2列表传入DrawLineStrip的问题

首先明确:_array/list 是Racket FFI里用来把Racket列表转换成C风格连续数组的工具,完全适配你这种给C函数传数组的场景。下面是具体步骤和代码示例:

1. 先定义对应C类型的Racket绑定

首先要把C里的Vector2和Color结构体用Racket FFI定义出来,确保类型匹配:

#lang racket/base
(require ffi/unsafe ffi/unsafe/define)

;; 绑定C的Vector2结构体
(define-cstruct _Vector2
  ([x _float]
   [y _float]))

;; 绑定C的Color结构体
(define-cstruct _Color
  ([r _ubyte]
   [g _ubyte]
   [b _ubyte]
   [a _ubyte]))

2. 正确绑定DrawLineStrip函数

绑定函数时,把第一个参数const Vector2 *points指定为(_array/list _Vector2),这个类型会自动把传入的Racket列表转换成C数组:

;; 绑定raylib的DrawLineStrip(假设raylib库路径正确)
(define-ffi-definer define-raylib (ffi-lib "raylib"))
(define-raylib DrawLineStrip
  (_fun (_array/list _Vector2)  ; 自动处理Racket列表转C数组
        _int                     ; 点的数量,手动传列表长度
        _Color                   ; 颜色参数
        -> _void))

3. 调用函数

直接传入你的Vector2列表、列表长度(用length获取)和颜色值即可:

;; 构造你的Vector2列表
(define my-line-points
  (list (make-_Vector2 10.0 20.0)
        (make-_Vector2 30.0 40.0)
        (make-_Vector2 50.0 60.0)
        (make-_Vector2 70.0 80.0)))

;; 调用DrawLineStrip画折线
(DrawLineStrip my-line-points (length my-line-points) (make-_Color 255 0 0 255))

手动转换数组的方式(如果需要单独处理)

如果不是在函数绑定里自动转换,你也可以手动用_array/list把列表转成C数组,再传给函数:

;; 手动转换列表为C数组
(define c-point-array (_array/list _Vector2 (length my-line-points) my-line-points))

;; 传入转换后的数组
(DrawLineStrip c-point-array (length my-line-points) (make-_Color 255 0 0 255))

简单来说,_array/list的第一个参数是元素的C类型(这里是_Vector2),第二个参数是数组长度(用length获取列表长度即可),第三个参数就是你的Racket Vector2列表。绑定函数时用(_array/list _Vector2)作为参数类型的话,调用时可以直接传列表,Racket会自动完成转换。

内容的提问来源于stack exchange,提问作者user1785730

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 17:42:41