Seite 1 von 1

Dynamischer Speicher

Verfasst: Sa Nov 20, 2010 3:41 pm
von MoonGuy
Okay, folgendes Problem. Ich bin zurzeit dabei ein Programm zu schreiben. Dabei will ich Bilder aus einem Ordner in SDL_Surface laden. Das ganze wollte ich dynamisch machen, damit mein Array immer groß genug ist. Folgendes Problem ist diese Fehlermeldung:

Code: Alles auswählen

no match for 'operator=' in '*(pictures + ((unsigned int)(((unsigned int)i) * 60u))) = IMG_Load(((const char*)(& image)))'
Grund für den Fehler sind wohl folgende Zeilen:
Variablen:
Global:

Code: Alles auswählen

char img_path[256] = "images/"; // path to image folder
char image[512]; // universal variable for final imagepath
Im Programm:

Code: Alles auswählen

bool done = false;
    bool update_sprites = true;
    SDL_Surface *screen, *background;
    SDL_Surface *pictures;
    DIR *dip;
    struct dirent *dit;
    unsigned int filecounter = 0;
    long int avaible_files = 0;
    int i = 0;
Codeauszug:

Code: Alles auswählen

if( ( dip = opendir( img_path ) ) == NULL )
    {
        printf( "opendir: Couldn't open directory %s\n", img_path );
        return 1;
    }

    while( ( dit = readdir( dip ) ) != NULL )
    {
        SDL_Surface* tmp;
        sprintf( image, "%s/%s", img_path, dit->d_name );
        tmp = IMG_Load( image );
        if( tmp )
            {
                filecounter++;
                avaible_files |= (long int)( pow( 2, i ) );
                SDL_FreeSurface( tmp );
            }
        i++;
    }

    printf( "Found %d JPG files in %s folder\n", filecounter, img_path );
    // allocate enough memory for the pictures
    pictures = (SDL_Surface*) calloc( filecounter, sizeof( SDL_Surface ) );

    // rewind directory and load all files into the allocated memory
    rewinddir( dip );
    i = 0;
    while( ( dit = readdir( dip ) ) != NULL )
    {
        if( avaible_files & (long int)( pow( 2, i ) ) )
        {
            sprintf( image, "%s/%s", img_path, dit->d_name );
            pictures[i] = IMG_Load( image );
        }
        i++;
    }
Hat jemand Ideen wie man das fixxen könnte? Die angesprochene Zeile der Fehlermeldung ist folgende:

Code: Alles auswählen

pictures[i] = IMG_Load( image );

Re: Dynamischer Speicher

Verfasst: Sa Nov 20, 2010 4:44 pm
von cloidnerux
So wie ich das sehe, ist SDL_SURFACE ein Struct um 1 Bild zu speichern.
Bedeutet also für dich, dass du für JEDES Bild das du laden möchtest Speicher allokieren musst.
Das heißt, du musst bei deinem calloc Aufruf die größe von SDL_SURFACE mit der Anzahl der Bilder mutliplizieren, um keine Speicherprobleme zu bekommen.
Okay, folgendes Problem. Ich bin zurzeit dabei ein Programm zu schreiben. Dabei will ich Bilder aus einem Ordner in SDL_Surface laden. Das ganze wollte ich dynamisch machen, damit mein Array immer groß genug ist. Folgendes Problem ist diese Fehlermeldung:

Code: Alles auswählen

    no match for 'operator=' in '*(pictures + ((unsigned int)(((unsigned int)i) * 60u))) = IMG_Load(((const char*)(& image)))'

Code: Alles auswählen

pictures[i] = IMG_Load( image );
Über den Index ruft man meines Wissens nach direkt den Typ ab und nicht den Pointer, also müsstest du, soweit ich das einschätze, folgendes schreiben:

Code: Alles auswählen

&pictures[i] = IMG_Load( image );

Re: Dynamischer Speicher

Verfasst: Sa Nov 20, 2010 4:48 pm
von nufan
IMG_Load() gibt einen Zeiger auf ein SDL_Surface zurück. Demnach sollte "pictures" ein Array aus Pointern auf SDL_Surfaces sein.

Code: Alles auswählen

SDL_Surface **pictures;
pictures = (SDL_Surface **) calloc (filecounter, sizeof(SDL_Surface *));
// ...
pictures[i] = IMG_Load(image);

Re: Dynamischer Speicher

Verfasst: So Nov 21, 2010 1:20 am
von MoonGuy
dani93 hat geschrieben:IMG_Load() gibt einen Zeiger auf ein SDL_Surface zurück. Demnach sollte "pictures" ein Array aus Pointern auf SDL_Surfaces sein.

Code: Alles auswählen

SDL_Surface **pictures;
pictures = (SDL_Surface **) calloc (filecounter, sizeof(SDL_Surface *));
// ...
pictures[i] = IMG_Load(image);
Okay, klappt nun alles super.

Neues Problem: Ich zähle ja praktisch beim 1. Durchgang des directory streams, wieviele Files ich habe, um dynamisch Speicher zu erstellen. Wenn ich nun aber rewinddir(DIR*) benutze, findet er hinterher die Files nichtmehr.
Bzw. er findet allgemein "mehr" files als ich habe. Ich habe in meinem "images" Ordner 2 files: "bg.jpg", "test.jpg". Er findet: "images/.", "images/..", "images/bg.jpg", "images/test.jpg" und beim 2. Durchlauf nurnoch "images/." und "images/..". Woran liegt das?

€dit: Fixxed mit realloc. Nebenbei: Das realloc Tutorial hat falsche Examples ;-)

Re: Dynamischer Speicher

Verfasst: So Nov 21, 2010 12:36 pm
von nufan
MoonGuy hat geschrieben:Neues Problem: Ich zähle ja praktisch beim 1. Durchgang des directory streams, wieviele Files ich habe, um dynamisch Speicher zu erstellen. Wenn ich nun aber rewinddir(DIR*) benutze, findet er hinterher die Files nichtmehr.
Bzw. er findet allgemein "mehr" files als ich habe. Ich habe in meinem "images" Ordner 2 files: "bg.jpg", "test.jpg". Er findet: "images/.", "images/..", "images/bg.jpg", "images/test.jpg" und beim 2. Durchlauf nurnoch "images/." und "images/..". Woran liegt das?
"." steht für das aktuelle Verzeichnis und ".." für das übergeordnete, die solltest du entsprechend aussortieren. Warum du beim zweiten Mal nur diese 2 Einträge bekommst kann ich nicht sagen, vielleicht versuchst du mal den Verzeichnis-Stream komplett neu zu öffnen anstatt in zurückzusetzen.
MoonGuy hat geschrieben:€dit: Fixxed mit realloc. Nebenbei: Das realloc Tutorial hat falsche Examples ;-)
Danke für den Hinweis, ich werd mal drüberschaun :)

Re: Dynamischer Speicher

Verfasst: So Nov 21, 2010 12:41 pm
von Xin
MoonGuy hat geschrieben:€dit: Fixxed mit realloc. Nebenbei: Das realloc Tutorial hat falsche Examples ;-)
Danke für die Korrektur :-)

Genau darum haben wir ein Wiki! :-)

Re: Dynamischer Speicher

Verfasst: So Nov 21, 2010 10:43 pm
von MoonGuy
Passt vom Thema her ganz gut, deshalb stelle ich die Frage hier. Das Programm läuft super, doch beim adden einer weiteren dynamischen Variable gibt es Probleme. Wenn ich sie rausnehme läuft alles, wenn sie drinne ist wird direkt 3 returned.

Variable hat folgende Zeilen Code:

Code: Alles auswählen

int *absolute_x; // the x value + screen position
/* ... */
// allocate memory once for reallocation
absolute_x = (int *) malloc( sizeof( int ) );
/* ... */
absolute_x = (int *) realloc( absolute_x, sizeof( int ) * block_count );
absolute_x[block_count-1] = x + screen_pos;
/* ... */
free( absolute_x );
Kann mir jemand sagen, warum direkt 3 returned wird? BTW. Wenn ich bei realloc statt absolute_x, &absolute_x nehme, startet das Programm. Returned aber 3, nachdem das Programm am realloc vom absolute_x angekommen ist(erst nach einem Input).

Re: Dynamischer Speicher

Verfasst: So Nov 21, 2010 10:46 pm
von cloidnerux
Kannst du uns bitte sagen, wann du ein return 3 in deinem Code hast?

Re: Dynamischer Speicher

Verfasst: So Nov 21, 2010 10:48 pm
von MoonGuy
Niergends. Ist eine SDL EIgentschaft die mit atexit( SDL_Quit ); zusammenhängt oder es gibt einen Error, der mir nicht angezeigt wird und es wird zufällig immer 3 returned oder ähnliches.