[SDL] process retourne -1073741819 [Résolu]

Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
- - Dernière réponse :  Pistol_Pete - 3 juin 2009 à 11:04
Bonjour a tous !

Voila j'ai fait une fonction que je souhaite appeler dans mon main... Je compile: aucune erreur
Mais lorsque je run, il y a une erreur. Le .exe a cessé de fonctionner, windows cherche une erreur,
et sur la console ils me mettent "Process returned <-1073741819>"..

Je ne vois pas du tout d'où peut provenir l'erreur puisque le code "semble" correcte...
Que faire??

Merci d'avance
Afficher la suite 

20/42 réponses

Meilleure réponse
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
3
Merci
C'est normal, dans ton main, tu as une boucle dans laquelle, tu vérifies si l'évenement est lorsque tu cliques sur la croix pour fermer la fenetre.

Le déplacement de souris, le clic de souris, l'appui sur une touche du clavier... sont des evenements SDL.

Donc si tu ne quittes pas la fenetre, par exemple, si tu bouges la souris, le default du switch est appelé et alors on re-initialise le tableau.

Il ne faut donc pas mettre de switch mais :

if(event.type == SDL_Quit) ...

et tu ne mets pas de else.

La fonction initavcdouble, il faut que tu ne l'appelles qu'une fois au début du programme.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de lectpe
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Bonjour,

Envoie ton code complet, qu'on voie ton erreur....

Cordialement, Grégory.
Commenter la réponse de lectpe
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
0
Merci
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <string>
#include <time.h>
#define numero 4

unsigned char solution[numero];

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, unsigned char i, unsigned char j);
void initavcdouble(SDL_Surface *screen,unsigned char i,unsigned char x,unsigned char y);

SDL_Surface *load_image( std::string filename )
{
    //Surface tampon qui nous servira pour charger l'image
    SDL_Surface* loadedImage = NULL;

    //L'image optimisée qu'on va utiliser
    SDL_Surface* optimizedImage = NULL;

    //Chargement de l'image
    loadedImage = SDL_LoadBMP( filename.c_str() );

    //Si le chargement se passe bien
    if( loadedImage != NULL ) {
        //Création de l'image optimisée
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Libération de l'ancienne image
        SDL_FreeSurface( loadedImage );
    }

    //On retourne l'image optimisée
    return optimizedImage;
}

void initavcdouble(SDL_Surface *screen,unsigned char i,unsigned char x,unsigned char y)
{

    SDL_Surface *dpion;

    srand(time(NULL));

    for(i=1;i<=4;i++)
    {
        do
        {
            solution[i]=rand()%9;
        }
        while (solution [i]==0);
        switch (solution[i])
        {
            case '1':
                dpion = load_image("pion beige.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
            case '2':
                dpion = load_image("pion bleu clair.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
            case '3':
                dpion = load_image("pion rose.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
            case '4':
                dpion = load_image("pion vert.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
            case '5':
                dpion = load_image("pion vert clair.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
            case '6':
                dpion = load_image("pion bleu.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
            case '7':
                dpion = load_image("pion marron.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
            case '8':
                dpion = load_image("pion rouge.bmp");
                apply_surface(30,40,dpion,screen,x,y);
                break;
        }
        x = x+50;
    }
}

void apply_surface( int x, int y, SDL_Surface *source, SDL_Surface *destination, unsigned char i, unsigned char j )
{
    SDL_Rect offset[i];
    offset[i].x = x+j;
    offset[i].y = y+i;
    SDL_BlitSurface( source, NULL, destination, &offset[i] );
}

int main( int argc, char *argv[ ] )
{
    unsigned char tour = 0;
    SDL_Surface *screen, *dpion;
    if( SDL_Init( SDL_INIT_VIDEO ) == -1 )
    {
        printf( "Can't init SDL:  %s\n", SDL_GetError( ) );
        return EXIT_FAILURE;
    }

    SDL_Quit();
    screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE );

    if( screen == NULL )
    {
        printf( "Can't set video mode: %s\n", SDL_GetError( ) );
        return EXIT_FAILURE;
    }
    initavcdouble(screen,1,0,0);
    SDL_Flip( screen );
    SDL_Delay (3000);
    SDL_FreeSurface( dpion );

    SDL_Quit;
    return EXIT_SUCCESS;
}

Tout ce que je veux faire pour l'instant, c'est faire une suite aleatoire de 4 "pions" (pour pouvoir faire un mastermind...)
Commenter la réponse de leptitced13
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Bah déjà tu n'as pas mis de default dans ton switch.
Commenter la réponse de lectpe
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
0
Merci
je viens de tester avec la modification du switch, et toujours le meme resultat au final 
Commenter la réponse de leptitced13
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Tu utilises des fonctions C++ avec les headers stdlib.h et stdio.h.

Essaie de les remplacer par iostream.

#include
Commenter la réponse de lectpe
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Encore une chose : JAMAIS de == dans un while, c'est toujours = .
Commenter la réponse de lectpe
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Quand tu initialises le mode vidéo, tu mets 
    screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE );

Ca veut dire que tes bitmap doivent être en résolution égale ou inférieure à 16 bits.

Si tu veux utiliser des images 24 bits, tu dois remplacer 16 par 32.
Commenter la réponse de lectpe
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Tu ne dois mettre SDL_Quit qu'à la fin du programme et une seule fois.

Tu dois faire
    screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE );
avant de faire SDL_Init().
Commenter la réponse de lectpe
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
0
Merci
merci pour toutes ces reponses. Seul hic desormais, le programme n'affiche plus ce nombre interminable,
mais il retourne 3 

de plus mes images (celle que je souhaite afficher comme tu as pu remarquer dans la fonction initavcdouble) n'apparaissent pas a l'ecran,
et ceux malgré les modifs ... Pourquoi?
Commenter la réponse de leptitced13
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
La seule fonction où tu renvoies quelquechose, c'est la fonction load_image.

Si jamais elle ne peut pas récupérer le const char* du std::string, il renvoie quelquechose qui ne vaut rien (NULL).

En gros elle crée un espace dans la mémoire et retourne ce qui s'y trouve et si son contenu n'est pas remplacé, elle renvoie ce qui était à l'emplacement dans la mémoire précédemment.

Donc si un autre programme a alloué le même espace de mémoire avec une variable "3" par exemple, et que l'espace est alloué sans remplacer la précédente valeur ("3"), elle renverra "3".
Commenter la réponse de lectpe
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
0
Merci
mais dans mon projet il n'y a pas d'autre programme que celui ci...
Commenter la réponse de leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
0
Merci
maintenant a la fin du run, je ne vois plus la fenetre "Process returned <....." ..!
d'où cela vient??
Commenter la réponse de leptitced13
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Je sais bien, mais c'est au niveau de la RAM que ça se passe :

quand tu exécute un programme, par exemple, quand tu démarres ton ordinateur, plusieurs programmes se lancent et ils mettent des trucs en mémoire mais ne les suppriment pas à la fin de l'exécution du programme.

Ils restent alors en mémoire.

Toi dans ton programme, tu alloues de la mémoire au même endroit que ces programmes et donc, tu peux récupérer des parties de données des anciens programmes...
Commenter la réponse de lectpe
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Bah s'il n'y a plus d'erreur, tant mieux.

Des fois, des problèmes se résolvent sans qu'on sache vraiment pourquoi...
Commenter la réponse de lectpe
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
0
Merci
ouai mais bon mes images veulent toujours pas apparaitre .
Commenter la réponse de leptitced13
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Essaie de mettre des SDL_Flip(screen);
Commenter la réponse de lectpe
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Tu as mis ça :
    SDL_Rect offset[i];
    offset[i].x = x+j;
    offset[i].y = y+i;
    SDL_BlitSurface( source, NULL, destination, &offset[i] );

Moi j'aurais simplement mis ça :
    SDL_Rect offset;
    offset.x = x+j;
    offset.y = y+i;
    SDL_BlitSurface( source, NULL, destination, &offset );
Commenter la réponse de lectpe
Messages postés
163
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
2
0
Merci
Peut être aussi que tu blittes des images en dehors de l'écran.
Commenter la réponse de lectpe
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
0
Merci
euh en fait je veux blitter 4 images.. donc j'ai:
apply_surface(30,40,dpion,screen,x,y); en augmentant x de 50 pour chaque image

donc premiere image a coordx = 30+x avec x=0
        deuxieme image a coordx = 30+x avec x=50

        quatrieme image a coordx = 30+x avec x=150

et la largeur totale de ma fenetre cest coordx = 640.. alors mes images sont blittées dans l'ecran non?
Commenter la réponse de leptitced13