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

D语言含静态数组结构体传递至C时数据异常问题求助

解决D语言结构体含静态数组传递给C时数据为空的问题

我来帮你排查这个问题!你遇到的情况是D和C之间结构体传递时数据没有正确初始化导致的,虽然结构体大小一致,但初始化方式不对会让内存里的数组值没有被正确写入。

问题根源

你的D代码里用vec3f v = vec3f(ar);来初始化结构体,但D语言中,默认的结构体构造函数并没有自动把传入的数组绑定到结构体的array成员上——这种写法其实没有正确完成成员赋值,导致结构体里的数组还是默认的零值,传递给C后自然输出全0。

解决方案

方案一:显式赋值结构体成员

直接创建结构体实例后,手动把数组赋值给它的array成员:

void test(){
 float[3] ar = [1f,2f,3f];
 vec3f v;
 v.array = ar; // 显式赋值成员
 testVec3f(v);
}

方案二:使用聚合初始化语法

用D的聚合初始化直接初始化结构体,确保数组被正确写入:

void test(){
 // 方式1:直接初始化数组成员
 vec3f v = {[1f,2f,3f]};
 testVec3f(v);

 // 方式2:先定义数组再初始化
 float[3] ar = [1f,2f,3f];
 vec3f v2 = {ar};
 testVec3f(v2);
}

补充说明

你之前的结构体定义是完全没问题的——extern(C)已经保证了D的结构体和C的结构体布局完全一致(大小12字节也验证了这一点),核心问题就是初始化步骤没有正确把数组数据写入结构体的内存中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:05:04