Вызов функции языка D с аргументом



Я изучаю 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)* в 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)


Я подозреваю, что это фундаментальное недоразумение с моей стороны, поэтому любая помощь будет оценена.
403   2  

2 ответов:

Массивы не являются неявно кастуемыми для указателей в D. вместо этого каждый массив (как статический, так и динамический) имеет внутреннее свойство .ptr, которое является указателем на его первый элемент.

Измените код на:

SDL_RenderDrawLines(renderer,points.ptr,1);

Учитывая, что вызов запрашивает указатель и длину, я считаю, что безопаснее определить вашу собственную оболочку:

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

(почему он не определен, я не знаю, любой удар по производительности от вызова дополнительной функции-это просто -inline от разрешения)

Comments

    Ничего не найдено.