Вызов функции языка 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)
Я подозреваю, что это фундаментальное недоразумение с моей стороны, поэтому любая помощь будет оценена.
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