[SDL] process retourne -1073741819

Résolu
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
- 29 mai 2009 à 20:46
 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

42 réponses

lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
31 mai 2009 à 12:22
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.
3
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 10:39
Bonjour,

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

Cordialement, Grégory.
0
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

30 mai 2009 à 17:28
#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...)
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 17:35
Bah déjà tu n'as pas mis de default dans ton switch.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

30 mai 2009 à 19:09
je viens de tester avec la modification du switch, et toujours le meme resultat au final 
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 20:38
Tu utilises des fonctions C++ avec les headers stdlib.h et stdio.h.

Essaie de les remplacer par iostream.

#include
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 20:38
Encore une chose : JAMAIS de == dans un while, c'est toujours = .
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 20:41
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.
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 20:43
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().
0
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

30 mai 2009 à 21:59
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?
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 23:42
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".
0
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

30 mai 2009 à 23:49
mais dans mon projet il n'y a pas d'autre programme que celui ci...
0
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

30 mai 2009 à 23:50
maintenant a la fin du run, je ne vois plus la fenetre "Process returned <....." ..!
d'où cela vient??
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 23:52
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...
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 23:54
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...
0
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

30 mai 2009 à 23:55
ouai mais bon mes images veulent toujours pas apparaitre .
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
30 mai 2009 à 23:56
Essaie de mettre des SDL_Flip(screen);
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
31 mai 2009 à 00:00
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 );
0
lectpe
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
31 mai 2009 à 00:01
Peut être aussi que tu blittes des images en dehors de l'écran.
0
leptitced13
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

31 mai 2009 à 00:08
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?
0