2017-08-11 8 views
-3

Ich habe versucht, überall auf der Suche nach einer Antwort, aber ohne Erfolg. in Debugger-Modus funktionierte es gut, aber wenn ich es im Release-Modus setzte es gib mir dieseIch bekomme einen "Access violation reading location" Fehler beim Ausführen im Freigabemodus - C++

Unbehandelte Ausnahme bei 0x00DC1814 in sdl Project.exe: 0xC0000005: Zugriffsverletzung Leseort 0x00000000.

ich habe meine Debugger und Release-Modus enthalten und Bibliothek die gleiche, auch meine Subsysteme sind die gleichen. hier ist mein Code, ich habe es von einem

Bit verkürzen
SDL_Surface *loadimage(); 

struct picture 
{  
    int maxframe; 
    SDL_Surface *surface = NULL; 
    SDL_Rect rect; 
    std::string filepath; 
}; 

SDL_Surface *background = NULL; 
SDL_Surface *backbuffer = NULL; 
SDL_Surface *holder = NULL; 


std::vector<picture *> veck; 

int main(int argc, char* argu[]){ 
    background = SDL_LoadBMP("pics/bac.bmp"); 

    if (background == NULL){ 
     return false; 
    } 

    int height = background->h; 
    int width = background->w; 

    init_testprogram(); 



    backbuffer = SDL_SetVideoMode(width, height, 32, SDL_SWSURFACE); 
    SDL_WM_SetCaption("Yamada's first window", NULL); 

    //this was here to test if i could format a surface more then once in 
    //the same format kept in just in case 
    holder = SDL_DisplayFormat(background); 
    background = SDL_DisplayFormat(holder); 
    SDL_FreeSurface(holder); 

     //this is where i get the error 
veck[0]->surface = loadimage(); 
veck[0]->rect.w = veck[0]->surface->w; 
veck[0]->rect.h = veck[0]->surface->h; 

//if commented out this is where i get my second error 
veck.push_back(new picture); 
veck[1]->rect.x = 39; 
veck[1]->rect.y = 49; 
veck[1]->surface = veck[0]->surface; 
veck[1]->rect.w = veck[0]->surface->w; 
veck[1]->rect.h = veck[0]->surface->h; 
veck[0]->rect.x = 500; 
veck[0]->rect.y = 200; 

    //printing to screan 

TTF_Font *font = NULL; 
Mix_Chunk *sound = NULL; 

picture *picture1;  

//if commented out again this is where i get my third error in sound 
sound = Mix_LoadWAV("sound/walking in grass.wav"); 
font = TTF_OpenFont("fonts/CaviarDreams.ttf", 100); 


    while (programisrunning()){ 

    //do SDL stuff herre 

    } 

    SDL_Delay(3000); 
    SDL_Quit(); 
    TTF_Quit(); 
    Mix_CloseAudio(); 

    int t; 
    std::cin >> t; 
    return 0; 
} 

///// Definitionen

SDL_Surface *loadimage(){ 
    veck.push_back(new picture); 

    SDL_Surface* rawimage = NULL; 
    SDL_Surface* processedimage = NULL; 

    veck[0]->filepath = "pics/walk 3.png"; 
    rawimage = IMG_Load(veck[0]->filepath.c_str()); 

    if (rawimage == NULL){ 
     errorreport("image 'walk 3.png' failed to load\n"); 
     return false; 
    } 

    processedimage = SDL_DisplayFormat(rawimage); 
    SDL_FreeSurface(rawimage); 

    if (processedimage == NULL){ 
     errorreport("image 'walk 3.png' failed to process\n"); 
     return false; 
    } 

    Uint32 colorkey = SDL_MapRGB(processedimage->format, 255, 255, 255); 
    SDL_SetColorKey(processedimage, SDL_SRCCOLORKEY, colorkey); 

// EDIt 
     if (processedimage == NULL) 
    errorreport("ERRRORORROROOR BUT WHY\n"); 



    return processedimage; 
} 

ich weiß, es ist nicht in der besten Art und Weise, Dinge zu tun, aber das ist mein Testprojekt für Sachen machen in SDL. wenn ich das Loch veck [0] Ding auskommentiere, bekomme ich den gleichen Fehler, aber weiter unten in veck.pushback() und wenn ich alle Vecks auskommentiere, dann bekomme ich den Fehler bei Ton. Ich benutze Visual Studio Exress 2013, wenn das überhaupt hilft. Ich verstehe nicht, was ich falsch mache.

i Sachen, die ich dachte, war ausgeschnitten sinnlos war hier

+0

Sie überprüfen nie die Rückgabe von loadimage, die einen Nullzeiger zurückgeben kann. – dkackman

+0

Warum benutzen Sie 'veck' in' loadimage() '? schaut mir zu, dass du nur eine string benötigst ... – vu1p3n0x

+0

@dkackman wenn ich "if (processedimage == NULL)" vor die return in loadimage() setze ist es gleich –

Antwort

2

Sie haben nicht definiertes Verhalten in veck[0]->surface = loadimage(); hinzuzufügen, da veck[0] wird ein Objekt nicht erhalten, bis loadimage() ausgeführt hat.

Es kann nicht garantiert werden, dass loadimage() aufgerufen wird, bevor veck[0] ausgewertet wird.

+0

Nun, wie kann ich den Wert von loadimage() dann bekommen. Ich hatte dieses Problem nie im Debugger und selbst wenn es eine Null zurückgibt, die es nicht von den Fehlerüberprüfungen verursachen sollte, warum würde das ein Problem verursachen, ist es ein Zeiger. –

+0

@ Y.mada in Betracht ziehen, ein 'Bild' in' loadimage() 'zu erstellen und es stattdessen – vu1p3n0x

+0

@ vu1p3n0x zurückzugeben, es hat funktioniert, vielen Dank. Ich bin mir nicht sicher, warum ich mich für die Wahl entschieden habe –

Verwandte Themen