#c #sdl-2 #sdl-image
#c #sdl-2 #sdl-изображение
Вопрос:
Я пытаюсь выяснить, почему этот код не работает, и после некоторого тестирования я обнаружил, что функция submitSprite содержит причину сбоя, но я не знаю, как это исправить
#include "renderer.h"
Renderer newRenderer(SDL_Window* window)
{
Renderer renderer;
renderer.renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
return renderer;
}
void destroyRenderer(Renderer renderer)
{
SDL_DestroyRenderer(renderer.renderer);
}
void submitSprite(Renderer renderer, Sprite sprite)
{
SDL_Rect* rect;
rect->x=sprite.x;
rect->y=sprite.y;
rect->w=sprite.w;
rect->h=sprite.h;
SDL_RenderCopy(renderer.renderer, sprite.texture, NULL, rect);
}
void render(Renderer renderer)
{
SDL_RenderPresent(renderer.renderer);
SDL_RenderClear(renderer.renderer);
}
средство визуализации.средство визуализации является SDL_Renderer*
Комментарии:
1.
SDL_Rect* rect;
требуетсяmalloc
2. @IrAM что вы имеете в виду? зачем ему нужен malloc?
3. @Gabryx86_64 потому что это просто указатель, и вы никогда не указывали на какой-либо выделенный объект… таким образом, вы ничего не можете с этим сделать и будете иметь неопределенное поведение, если вы это сделаете.
4. Вам также следует подумать, действительно ли вы хотите передавать такие структуры по значению, поскольку они будут копировать их, что, если они большие, не нужно и может снизить производительность. Чтобы избежать их копирования, передавайте их по указателю на-
const
(если вам нужно что-либо изменить, удалитеconst
).5. Вам может повезти, что он разбился. Такого рода ошибки могут иметь всевозможные странные побочные эффекты. 🙂
Ответ №1:
void submitSprite(Renderer renderer, Sprite sprite)
{
SDL_Rect* rect;
rect->x=sprite.x;
rect->y=sprite.y;
rect->w=sprite.w;
rect->h=sprite.h;
SDL_RenderCopy(renderer.renderer, sprite.texture, NULL, rect);
}
Здесь вы получаете доступ к указателю, который никогда не был инициализирован. Поэтому либо используйте локальную переменную, либо выделите (и освободите) память для нее.
т.е.:
void submitSprite(Renderer renderer, Sprite sprite)
{
SDL_Rect rect;
rect.x=sprite.x;
rect.y=sprite.y;
rect.w=sprite.w;
rect.h=sprite.h;
SDL_RenderCopy(renderer.renderer, sprite.texture, NULL, amp;rect);
}
Комментарии:
1. Как также указывало underscore_d, вы должны использовать указатели вместо передачи по значению. Делает это намного быстрее. 😉
Ответ №2:
Я не могу написать комментарий, но я просто хотел бы добавить, что вы должны создать one
экземпляр an SDL_Renderer
, а не продолжать создавать его, когда вам это нужно. Как сказал Devolus, передача по указателю. Передача по значению после его создания также приведет к утечке памяти, если вы забудете вызвать SDL_DestroyRenderer()
, что также увеличивает медлительность этого метода. Когда вам нужен средство визуализации, укажите параметр SDL_Renderer* renderer