3

我正在学习 D 并且主要有 C# 方面的经验。具体来说,我正在尝试使用Derelict3 绑定到 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);
}

并且编译器抱怨我没有为const(SDL_Point)*in传递正确类型的参数points

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

我怀疑这是我的一个基本误解,所以任何帮助将不胜感激。

4

2 回答 2

5

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

将您的代码更改为:

SDL_RenderDrawLines(renderer,points.ptr,1);
于 2013-08-13T05:19:23.267 回答
1

鉴于调用要求指针和长度,我觉得定义自己的包装器更安全:

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

(为什么没有定义我不知道,额外的函数调用对性能造成的任何影响都-inline离解决还差得很远)

于 2013-08-13T10:40:34.170 回答