2015-12-03 59 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

相關問題