我正在尝试制作一个绘制到屏幕的程序,同时对数组进行排序,就像在这个视频中一样:https://www.youtube.com/watch?v=kPRA0W1kECg。
这是我的问题:我重载了比较和赋值运算符,在assign运算符中我想调用draw()
函数,它将绘制到屏幕上。但是当我这样做时,我的代码失败了,确切地说是导致它崩溃的行SDL_RenderFillRect(renderer, &r)
。 (它开始运行然后崩溃,甚至无法在任务管理器中结束)。
我的代码:
using namespace std;
int main(int argc, char *argv[])
{
srand(time(NULL));
SDL_Window *window = nullptr;
SDL_Renderer *renderer = nullptr;
window = SDL_CreateWindow("Rendezo algoritmus", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP);
renderer = SDL_CreateRenderer(window, 0, 0);
SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);
SDL_RenderClear(renderer);
SDL_Rect r;
r.y = 0;
r.x = 0;
r.w = 50;
r.h = 50;
SortHelper<int> mySortInts[] = { SortHelper<int>{2}, SortHelper<int>{5}, SortHelper<int>{1}, SortHelper<int>{4}, SortHelper<int>{3} };
std::vector<SortHelper<int>> myvector(mySortInts, mySortInts + 5);
SDL_Rect *rectArr = new SDL_Rect[myvector.size()];
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
int i = 0;
int rectXCoord = 0;
int rectWidth = (SDL_GetWindowSurface(window)->w) / myvector.size();
for (SortHelper<int> s : myvector) {
s.setRenderer(renderer);
rectArr[i].w = rectWidth;
rectArr[i].h = s.getHeight();
rectArr[i].x = rectXCoord;
rectArr[i].y = (SDL_GetWindowSurface(window)->h) - (rectArr[i].h);
rectXCoord += (SDL_GetWindowSurface(window)->w) / myvector.size();
SDL_RenderFillRect(renderer, &rectArr[i]);
SDL_RenderPresent(renderer);
}
std::sort(myvector.begin(), myvector.end());
SDL_Delay(500);
SDL_DestroyWindow(window);
SDL_Quit();
delete[] rectArr;
return EXIT_SUCCESS;}
我的sorthelper.h:
#pragma once
class SDL_Renderer;
template<typename T>
class SortHelper {
T data;
int height;
int width;
int x;
int y;
SDL_Renderer *renderer;
public:
SortHelper(SortHelper &a) { data = a.data; }
SortHelper(T a) { data = a; }
bool operator<(SortHelper a) {
return data < a.data;
}
void operator=(SortHelper const a) {
data = a.data;
height = a.height;
draw();
SDL_Delay(10);
}
T getValue() { return data; }
int getHeight() {
return rand() % 500;
}
void setRenderer(SDL_Renderer *r) {
renderer = r;
}
void draw() {
SDL_Rect r;
r.x = x;
r.y = y;
r.w = width;
r.h = height;
SDL_RenderFillRect(renderer, &r);
SDL_RenderPresent(renderer);
}};
现在我可能知道导致问题的原因,但不能提出或找不到任何解决方案。我认为遗留代码的是SDL_Renderer
开头的sorthelper.h
类声明。但是,如果我删除该声明,我的代码将无法编译,在我声明SDL_Renderer *renderer;
的地方给出语法错误。所以,如果我是对的,我的问题是,如何在类中声明SDL_Renderer成员变量?如果我不是,那么问题是什么?
答案 0 :(得分:1)
在主循环for (SortHelper<int> s : myvector)
中,您正在制作myvector
元素的副本,并在循环中处理该副本。因此,myvector
元素中的渲染器未设置,并且您将空指针传递到SDL_RenderFillRect
中的draw
。
您应该将循环声明为
for (SortHelper<int> &s : myvector)
此外,您并未在该循环中递增i
,因此您始终使用rectArr[0]
,但这似乎并不重要,因为您只在循环中使用该向量。