D语言中带参数的函数调用

3
我正在学习D语言,主要有C#的经验。具体来说,我在尝试使用Derelict3 Binding 到SDL2。我已经能够成功地得到一些基本功能的工作,但我遇到了一个问题:如何为特定的调用创建一个数组参数。
这个库包含一个调用:
SDL_RenderDrawLines(SDL_Renderer*, const(SDL_Point)*, int)  //Derelict3 Binding

我一直无法正确地形成这个论点

const(SDL_Point)*

此函数的SDL文档指出,该参数是一个SDL_Point数组,但我不清楚如何创建适合传递给此函数的数组。
以下是我目前的示例:
void DrawShape(SDL_Renderer* renderer)
{
    SDL_Point a = { x:10, y:10};
    SDL_Point b = { x:500, y:500};

    const(SDL_Point[2]) points = [a,b];

    Uint8 q = 255;
    SDL_SetRenderDrawColor(renderer,q,q,q,q);
    SDL_RenderDrawLines(renderer,points,1);
}

编译器报错,提示我在points中没有传递正确类型的参数const(SDL_Point)*

Error: function pointer SDL_RenderDrawLines (SDL_Renderer*, const(SDL_Point)*, int)
is not callable using argument types (SDL_Renderer*, const(SDL_Point[2u]), int)

我怀疑这是我基本的误解,所以非常感谢您的帮助。

2个回答

5

在D语言中,数组不能隐式转换为指针。相反,每个数组(静态和动态)都有一个内在的.ptr属性,它是指向其第一个元素的指针。

请将您的代码更改为:

SDL_RenderDrawLines(renderer,points.ptr,1);

很有可能 int 参数是数组的长度,因此调用将是 SDL_RenderDrawLines(renderer, points.ptr, points.size); - ratchet freak
最初我有类似的东西,但是在尝试让它起作用的各种排列组合中,由于其中一种尝试不支持.length,所以我将其删除了。但我会重新加入类似的内容,谢谢! - MrJolo

1

考虑到调用需要指针和长度,我认为更安全的做法是定义您自己的包装器:

SDL_RenderDrawLines(SDL_Renderer* rend, const SDL_Point[] points){
    SDL_RenderDrawLines(rend,points.ptr,points.length);
}

(我不知道为什么它没有被定义,任何额外函数调用的性能损失都可以通过内联方式得到解决。)

请原谅我的经验不足,我不熟悉如何将函数内联。您只需向编译器传递一个“-inline”参数,它就会确定何时进行内联?我在D Lang: Functions找到了以下内容:内联函数没有内联关键字。编译器决定是否内联函数,类似于寄存器关键字不再与编译器对变量寄存决策相关。 (也没有寄存器关键字。) - MrJolo
“-inline” 是一个编译器参数,允许编译器内联一些函数,在调试构建中默认禁用以便于调试器的清晰度。 - ratchet freak
这段代码不能直接使用。当前模块和导入的模块中的函数不属于同一重载集合。被调用者必须是完全限定的,或者函数名应该不同。为了使用带有前缀标识符的C库进行封装,通常使用命名空间,或在面向对象编程语言中缺少命名空间时,使用类型(例如“SDL”结构体)和静态方法,因此调用变成了SDL.RenderDrawLines。 - Vladimir Panteleev
“为什么它没有被定义我不知道” - 因为一旦你开始沿着这条路走,为了保持一致性,你也会想要处理结构体中的数组,以及函数返回的结构体中的数组,这就变成了一个滑坡,朝着某种完整的编组巨兽的方向发展。 - Vladimir Panteleev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接