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

Signaler
Messages postés
15
Date d'inscription
jeudi 19 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009
-
 Pistol_Pete -
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

Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
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.
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
Bonjour,

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

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

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

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

Essaie de les remplacer par iostream.

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

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

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

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

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

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?