Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SDL] Program zawiesza się po dodaniu więcej niż 80 obiektów,

Ostatnio zmodyfikowano 2014-07-14 16:16
Autor Wiadomość
saguaro
Temat założony przez niniejszego użytkownika
[SDL] Program zawiesza się po dodaniu więcej niż 80 obiektów,
» 2014-07-13 10:39:06
Jak mam zmienić kod,aby program zużywał mniej pamięci?
Próbowałem usunąć dynamiczną tablicę obiektów, ale wtedy program się cały sypał.
Kod (main):
C/C++
#include <SDL/SDL.h>
#include <ctime>
#include <cstdlib>
#include <SDL_image.h>
#include "klocek.h"
SDL_Surface * ekran = NULL;
SDL_Surface * tlo = NULL;
int tabx[ 10 ] = { 64, 128, 192, 256, 320, 384, 448, 512, 576, 640 };
int taby[ 30 ];

bool zakoncz = false;
int losowy_x, losowy_y;
SDL_Event akcja;
long int ilosc, a, b;
int t_x, t_y, x, y, calkowita, mysz_x, mysz_y;
SDL_Rect mysz;
SDL_Surface * ziemia = NULL;
SDL_Surface * trawa = NULL;
void umiesc( SDL_Surface * a, int x, int y, int w, int h,
SDL_Surface * b, int xx, int yy, int ww, int hh )
{
    SDL_Rect miejsce1;
    SDL_Rect miejsce2;
    miejsce1.x = x;
    miejsce1.y = y;
    miejsce1.w = w;
    miejsce1.h = h;
    miejsce2.x = xx;
    miejsce2.y = yy;
    miejsce2.w = ww;
    miejsce2.h = hh;
    SDL_BlitSurface( a, & miejsce1, b, & miejsce2 );
}

int zwroc_x()
{
    for( int i = 0; i < 10; i++ )
    {
        x = i;
        if( mysz.x < tabx[ i ] ) return tabx[ i - 1 ];
       
    }
}
int zwroc_y()
{
    for( int i = 0; i < 10; i++ )
    {
        y = i;
        if( mysz.y < taby[ i ] ) return taby[ i - 1 ];
       
    }
}

int main( int argc, char * args[] )
{
    srand( time( NULL ) );
    SDL_Init( SDL_INIT_EVERYTHING );
    for( int i = 0; i <= 30; i++ )
    {
        taby[ i ] = 48 *( i + 1 );
    }
    ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE | SDL_DOUBLEBUF );
    tlo = IMG_Load( "panorama.png" );
    trawa = IMG_Load( "k1.png" );
    ziemia = IMG_Load( "k2.png" );
    Klocek * klocek;
    klocek = new Klocek[ ilosc ];
    SDL_BlitSurface( tlo, NULL, ekran, NULL );
    for( int i = 0; i < 10; i++ )
    {
        losowy_y =( rand() % 2 ) + 1;
        klocek[ ilosc++ ];
        klocek[ ilosc ].ID = 1;
        if( losowy_y == 1 ) klocek[ ilosc ].polozenie_y = taby[ 4 ];
       
        if( losowy_y == 2 ) klocek[ ilosc ].polozenie_y = taby[ 5 ];
       
        klocek[ ilosc ].polozenie_x += 64 * i;
        if( losowy_y == 1 )
        {
            klocek[ ilosc++ ];
            klocek[ ilosc ].ID = 2;
            klocek[ ilosc ].polozenie_y = taby[ 5 ];
            klocek[ ilosc ].polozenie_x = i * 64;
        }
       
    }
    for( int i = 6; i < 10; i++ )
    {
        for( int j = 0; j < 10; j++ )
        {
            klocek[ ilosc++ ];
            klocek[ ilosc ].ID = 2;
            klocek[ ilosc ].polozenie_y = taby[ i ];
            klocek[ ilosc ].polozenie_x = j * 64;
        }
    }
   
    while( !zakoncz )
    {
        for( int j = ilosc; j != 0; j-- )
        {
            if( klocek[ j ].ID == 1 ) umiesc( trawa, 0, 0, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 );
           
            if( klocek[ j ].ID == 2 ) umiesc( ziemia, 0, 0, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 );
           
            SDL_Flip( ekran );
           
        }
       
        while( SDL_PollEvent( & akcja ) )
        {
            if( akcja.type == SDL_KEYDOWN )
            {
                if( akcja.key.keysym.sym == SDLK_ESCAPE )
                {
                    zakoncz = true;
                }
               
            }
            if( akcja.type == SDL_MOUSEMOTION )
            {
                mysz_x = akcja.motion.x;
                mysz_y = akcja.motion.y;
                if( mysz_y >= 432 && mysz_y <= 480 )
                {
                    for( int j = ilosc; j != 0; j-- )
                    {
                        umiesc( tlo, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 );
                        klocek[ j ].polozenie_y -= 48;
                    }
                }
                if( mysz_y >= 0 && mysz_y <= 48 )
                {
                    for( int j = ilosc; j != 0; j-- )
                    {
                        umiesc( tlo, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 );
                        klocek[ j ].polozenie_y += 48;
                    }
                }
               
            }
           
        }
       
        SDL_Flip( ekran );
    }
    delete[] klocek;
    SDL_FreeSurface( tlo );
    SDL_FreeSurface( ziemia );
    SDL_FreeSurface( trawa );
    SDL_Quit();
    return 0;
}
P-113729
Jacob99
» 2014-07-13 12:18:28
A nie możesz po prostu użyć
std::vector < Klocek > vec( ilosc )
?
P-113732
saguaro
Temat założony przez niniejszego użytkownika
» 2014-07-13 12:35:48
Mógłbym, ale jeszcze nie korzystałem z tej biblioteki i podejrzewam, że nic nie zmieni :-/
Dziwne, że jeśli napiszę:
C/C++
for( int i = 6; i < 10; i++ )
{
    for( int j = 0; j < 10; j++ )
    {
        klocek[ ilosc++ ];
        klocek[ ilosc ].ID = 2;
        klocek[ ilosc ].polozenie_y = taby[ i ];
        klocek[ ilosc ].polozenie_x = j * 64;
    }
}
to program wygeneruje ładny teren, lecz dosyć ograniczony.
A jeżeli, zwiększę liczbę rzędów klocków to:
C/C++
for( int i = 6; i < 13; i++ ) //   wywala czarny ekran,
{ // albo zakończenie programu wyświetla komunikat o tym, że program 
    for( int j = 0; j < 10; j++ ) // przestał działać.    
    {
        klocek[ ilosc++ ];
        klocek[ ilosc ].ID = 2;
        klocek[ ilosc ].polozenie_y = taby[ i ];
        klocek[ ilosc ].polozenie_x = j * 64;
    }
}
P-113733
Jacob99
» 2014-07-13 12:44:18
Mógłbym, ale jeszcze nie korzystałem z tej biblioteki i podejrzewam, że nic nie zmieni :-/
Z jakiej biblioteki?
wywala czarny ekran, albo zakończenie programu wyświetla komunikat o tym, że program przestał działać.
Szczegóły błędu?   
P-113734
saguaro
Temat założony przez niniejszego użytkownika
» 2014-07-13 12:50:29
std::vector < Klocek > vec( ilosc )
Biblioteka vector?
Debug:
-------------- Build: Debug in Plansza (compiler: GNU GCC Compiler)---------------

Target is up to date.
Nothing to be done (all items are up-to-date).
P-113736
Jacob99
» 2014-07-13 13:04:03
Biblioteka vector?
Jeśli już to STL.

A co do błędu, to pokaż cały kod razem z klocek.h etc.
P-113737
saguaro
Temat założony przez niniejszego użytkownika
» 2014-07-13 13:11:52
Ok, klasa vector, biblioteka STL :P
klocek.h:
#include <SDL/SDL.h>
#include <SDL_image.h>
#include <string>
using namespace std;
class Klocek
{
friend void wczytaj(Klocek &k);
protected:
int* a, *b;
public:
    int ID;
    SDL_Surface*tekstura=NULL;
    int polozenie_y, polozenie_x;
    Klocek();
    void zmien();
    void ruszaj();
    void usun();
};
klocek.cpp:
#include <SDL/SDL.h>
#include <SDL_image.h>
#include <string>
#include "klocek.h"
using namespace std;
extern void umiesc(SDL_Surface* a,int x, int y, int w, int h,
            SDL_Surface* b,int xx, int yy, int ww, int hh);

extern int zwroc_x();
extern int zwroc_y();
extern SDL_Surface*ekran, *tlo;
extern int polozenie_y, polozenie_x,x,y,calkowita,ID;
extern int tabx[10],taby[10];
Klocek::Klocek()
{
    calkowita++;
}
void Klocek::ruszaj()
{
            tekstura=IMG_Load("k2.png");
            polozenie_x=zwroc_x();
            polozenie_y=zwroc_y();
            umiesc(tekstura,0,0,64,48,ekran,polozenie_x,polozenie_y,64,48);

}

void Klocek::usun()
{
            polozenie_x=zwroc_x();
            polozenie_y=zwroc_y();
            umiesc(tlo,polozenie_x,polozenie_y,64,48,ekran,polozenie_x,polozenie_y,64,48);
}
debug:
||=== Build: Debug in Plansza (compiler: GNU GCC Compiler) ===|
C:\Users\Kacper\Desktop\Projekty\Plansza\klocek.h|12|warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp||In function 'int SDL_main(int, char**)':|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|70|warning: value computed is not used [-Wunused-value]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|70|warning: value computed is not used [-Wunused-value]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|77|warning: value computed is not used [-Wunused-value]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|77|warning: value computed is not used [-Wunused-value]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|88|warning: value computed is not used [-Wunused-value]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|88|warning: value computed is not used [-Wunused-value]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp||In function 'int zwroc_y()':|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|50|warning: control reaches end of non-void function [-Wreturn-type]|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp||In function 'int zwroc_x()':|
C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|42|warning: control reaches end of non-void function [-Wreturn-type]|
||=== Build finished: 0 error(s), 9 warning(s) (0 minute(s), 1 second(s)) ===|
||=== Run: Debug in Plansza (compiler: GNU GCC Compiler) ===|
 
P-113738
Jacob99
» 2014-07-13 13:39:59
Nigdzie nie inicjalizujesz zmiennej ilosc(powinna mieć wartość 0, bo jest globalna), a korzystasz z niej do tworzenia tablicy dynamicznej (czyli powinieneś utworzyć tablicę o rozmiarze 0 (co jest błędem czasu wykonania)) i w licznych pętlach przekraczasz rozmiar tej tablicy. Dlatego lepiej użyć std::vector. To samo, chociaż to nie powinno wpływać na działanie programu, jest ze zmienną calkowita.

W sumie używasz o wiele za dużo zmiennych globalnych.
P-113739
« 1 » 2
  Strona 1 z 2 Następna strona