2015-12-03 57 views
-1

我试图做一个程序,绘制到屏幕上,同时排序数组,如在此视频:https://www.youtube.com/watch?v=kPRA0W1kECg
这是我的问题:我重载了比较和赋值运算符,并且在赋值运算符中我想调用draw()函数,该函数将绘制到屏幕上。但是当我这样做时,我的代码就会失败,确切地说就是导致它崩溃的行SDL_RenderFillRect(renderer, &r)。 (它开始运行然后崩溃,甚至不能在任务管理器中结束)。为什么我的程序在使用SDL_RenderFillRect()时崩溃?

我的代码:

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); 
}}; 

现在,我可能有一个想法是什么原因造成的问题,但无法拿出,也没有找到任何解决方案。我认为代码的破坏是在sorthelper.h开始的SDL_Renderer类声明。但如果我删除该声明,我的代码将不会编译给出语法错误,我声明SDL_Renderer *renderer;。所以如果我是对的,我的问题是,我怎么能在类中声明一个SDL_Renderer成员变量?如果我不是,那么问题是什么?

+0

一个简单的问题:为什么你在这里不使用vector [SDL_Rect * rectArr = new SDL_Rect [myvector.size()];'?为什么不只是:'std :: vector rectArr(myvector.size());' – PaulMcKenzie

+0

我没有想到它,但我喜欢练习指针,也不需要vector的功能。可以肯定地改变,但我不认为这是主要问题。 – Broccholio

+0

此外,为什么您的'SortHelper'复制语义在用户定义的复制构造函数和赋值运算符之间有所不同?复制构造函数和赋值操作符应该只是做这些操作,除非你想要一个充满bug和怪异行为的程序。事实上,复制构造函数是非常错误的。你应该复制所有的成员,而不仅仅是其中的一部分。 – PaulMcKenzie

回答

1

在您的主循环for (SortHelper<int> s : myvector)中,您正在复制myvector元素,并在循环中处理该副本。因此myvector元素中的渲染器没有被设置,并且您将中的空指针传递给draw

你应该申报的环路

for (SortHelper<int> &s : myvector) 

而且你不递增在循环i,所以你总是使用rectArr[0]但这似乎并不重要,因为你只用内矢量循环。

+0

谢谢你解决了这个崩溃。 – Broccholio

相关问题