C++ SFML

0

Witam wszystkich!
Próbuję napisać program, który stworzy mi jednokolorową "szachownice" (dwuwymiarowa tablica obiektów). Jej rozmiar ustawiam zmieniając wartości zmiennych: W w main.cpp i wymiar w pole.cpp. Wszystko działa pod warunkiem że ustawiane przeze mnie wartości są mniejsze od 60 (np W=50 wymiar=50, W=30, wymiar=30). Stworzenie szachownicy 70 na 70 sprawia że pomimo udanej kompilacji program się wysypuje i wyświetla mi się komunikat program.exe przestał działać. Nie wiem skąd wynika ten błąd i nie potrafię sobie z nim poradzić.

main.cpp:

#include "SFML/Graphics.hpp"
#include <iostream>
#include "pole.h"

using namespace std;

int W=60;
int main()
{
    sf::RenderWindow window(sf::VideoMode(900, 900), "Program", sf::Style::Titlebar | sf::Style::Close);

    Pole p[W][W];

    sf::Texture texture_pole;

    if (!texture_pole.loadFromFile( "x.png", sf::IntRect(0, 0, 8, 8)))
    {
        return EXIT_FAILURE;
    }

for (int t=0; t<W; t++)
{
    for(int r=0; r<W; r++)
    {
    p[t][r].sprite.setTexture(texture_pole);
    }
}
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }

            if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
            {
                window.close();
            }
        }

        window.clear();
        for(int t=0; t<W; t++)
        {
            for(int r=0; r<W; r++)
            {
                p[t][r].update();
                window.draw(p[t][r].sprite);
            }
        }
        window.display();
    }
}

pole.h:

#include "SFML/Graphics.hpp"
#include <iostream>

using namespace std;

class Pole
{
public:
    sf::RectangleShape rect;
    sf::Sprite sprite;
    Pole();
    void update();
};

pole.cpp:

#include "SFML/Graphics.hpp"
#include <iostream>
#include "pole.h"

using namespace std;

Pole::Pole()
{
    static int wymiar=60;
    static int i=2;
    static int j=2;
    static int licz_i=0;
    rect.setPosition(i, j);
    i=i+10;
    licz_i++;
    if(licz_i==wymiar)
    {
        j=j+10;
        i=2;
        licz_i=0;
    }
}

void Pole::update()
{
    sprite.setPosition(rect.getPosition());
}
0

Wygląda to trochę tak, jakby się okno kończyło (brakowało miejsca do rysowania), ale nie widzę na pierwszy rzut oka czemu. Co mówi debugger?

0

Sprawdzałem czy jeśli zmniejszę okno tak, żeby część kwadracików była poza oknem, to coś się stanie. Program zadziałał poprawnie przy stworzeniu "słupka" który wykracza poza obszar okna. Debuggera zwraca komunikat "Program received signal SIGSEGV, Segmentation fault." Z tego co znalazłem w internecie jest to błąd związany z wyciekiem pamięci. Jak go znaleźć i zlikwidować?

0

up

2

Próbujesz utworzyć np. (70 * 70) = 4900 instancji obiektu Pole na stosie(!).
Każde pole ma sf::Sprite oraz sf::RectangleShape...
... co daje nam 70 * 70 * miejsce, które potrzeba na stworzenie jednej instancji Pole.
Sprawdź ile masz pamięci przeznaczonej na stos programu i porównaj ją do ilości pamięci, którą chcesz tam "zmieścić".
Możesz użyć klasy std::vector,

const int W = 70;
vector<vector<Pole>> p (W, vector<Pole>(W));

albo:

const int W = 70;
...
...
//W main:
...
Pole ** p = new Pole[W];
for(int i = 0; i < W;++i)
        *(p+i) = new Pole[W];
...

//nie zapomnij o dealokacji
for (int i = 0; i < W; ++i)
{
    delete[] * (p + i);
	*(p + i) = nullptr;
}
delete[] p;
p = nullptr;
0

Wielkie dzięki, już wszystko działa!

1 użytkowników online, w tym zalogowanych: 0, gości: 1