IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

strcpy et/ou strcat me font crash


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 14
    Par défaut strcpy et/ou strcat me font crash
    Bonjour,

    mon jeu crash quand j'utilise ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      for(int i=0; i< NbJoueur + NbIA; i++){ //pour chaque joueur
     
            switch(i){
                case 0: //j1
                    for(int j=0; j<=5; j++){  //remplir les mains des joueurs de 6 tuiles
                            cmainj1[j] = pioche[posi_pioche]; //cmainj1 est un tableau de caractère
                            mainj1[j] = pioche[posi_pioche];  //cmainj1 et pioche sont des tableaux de valeurs numériques
                            strcpy(CheminImage,"all_");
                            strcat(CheminImage, cmainj2[j]);
                            posi_pioche++;
                            al_draw_bitmap(CheminImage, MAINX1 + j*30, MAIN1Y, 0);
     
                    }
                    break;
    Quand je retire ces deux lignes : strcpy(CheminImage,"all_"); et strcat(CheminImage, cmainj2[j]); il n'y a plus de soucis.
    Je ne comprends pas le problème.

    Par ailleurs, est ce un soucis de faire mainj1[j] = pioche[posi_pioche]; sachant que mainj1 est un tableau de caractères et pioche[posi_pioche] est un chiffre numérique ?

    Merci d'avance,

    Akiwhite

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 14
    Par défaut
    zut ! Je viens de me rendre compte que c'est CheminImage de al_draw_bitmap(CheminImage, MAINX1 + j*30, MAIN1Y, 0); qui me fait crasher !

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Le premier paramètre de al_draw_bitmap est sencé être un ALLEGRO_BITMAP, strcpy prend un char*. Donc si ton truc compile tu as un sacré problème..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 14
    Par défaut
    Oui effectivement je me suis rendu compte du problème trop tard, as-tu une idée de comment faire pour résoudre mon problème ?

    Pourquoi cette alternative ne fonctionne-t-elle pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    ALLEGRO_BITMAP*all_xx;
    for(int i=0; i< NbJoueur + NbIA; i++){ //pour chaque joueur
     
            switch(i){
                case 0: //j1
                    for(int j=0; j < 6; j++){ //remplir les mains de 6 cases
                            cmainj1[j] = pioche[posi_pioche]; //cmainj1 est un tableau de caractère
                            mainj1[j] = pioche[posi_pioche];  //cmainj1 et pioche sont des tableaux de valeurs numériques
                            strcpy(CheminImage,"img/tuiles/");
                            strcat(CheminImage, cmainj1[j]);//les fichiers pnj portent les nom 00.pnj, 01.pnj ect ..
                            strcat(CheminImage, ".png");
                            posi_pioche++;
                            all_xx = al_load_bitmap(CheminImage);
                            al_draw_bitmap(all_xx, MAINX1 + j*30, MAIN2Y, 0);
                            al_destroy_bitmap(all_xx);
                    }
                    break;
    L'erreur est la suivante : Process returned -1073741819 (0xC0000005)
    mémoire mal (ou pas) libérée c'est donc surement du aux bitmap ...
    Je ne comprends pas l'erreur !

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Akiwhite Voir le message
    Pourquoi cette alternative ne fonctionne-t-elle pas ?
    Sais pas. Ca aurait été bien que tu nous montres à minima comment est défini "CheminImage", "cmainj1" et si tu peux garantir que "cmainj1[j]" est bien une chaine (une suite de caractères terminée par le caractère '\0').

    Citation Envoyé par Akiwhite Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                   strcpy(CheminImage,"img/tuiles/");
                            strcat(CheminImage, cmainj1[j]);//les fichiers pnj portent les nom 00.pnj, 01.pnj ect ..
                            strcat(CheminImage, ".png");
    Oui, pourquoi faire simple... sprintf(CheminImage, "img/tuiles/%s.png", cmainj1[j])
    Citation Envoyé par Akiwhite Voir le message
    Par ailleurs, est ce un soucis de faire mainj1[j] = pioche[posi_pioche] sachant que mainj1 est un tableau de caractères et pioche[posi_pioche] est un chiffre numérique ?
    Absolument pas. Tout est nombre en C, y compris les caractères. T'as donc parfaitement le droit de copier un chiffre numérique (au fait, "numérique" par opposition à quoi ? un chiffre "non numérique" ???) dans un char (nombre compris entre 0 et 255). Si le chiffre numérique est trop grand, la copie le tronquera via modulo 255.
    Maintenant si ta question est "est-ce que cette instruction correspond à ce que j'ai dans la tête", la réponse dépend alors de ce que tu as dans la tête et ça on peut pas le deviner...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 14
    Par défaut
    Bonjour et merci pour ta réponse !
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Sais pas. Ca aurait été bien que tu nous montres à minima comment est défini "CheminImage", "cmainj1" et si tu peux garantir que "cmainj1[j]" est bien une chaine (une suite de caractères terminée par le caractère '\0').
    cmainj1 ressemble à ca : char cmainj1[6];, non ma suite de caractère ne se termine pas par le caractère '\0', comment je suis censé faire ?
    Un autre problème se pose : le tableau cmainj1[6] ne peut stocker que 6 caractères alors je suppose qu'il faut procéder autrement pour récupérer des nombres à deux chiffres.
    CheminImage est défini comme tel : CheminImage[20]; Y a t il besoin d'un char ?

    sprintf(CheminImage, "img/tuiles/%s/.png", cmainj1[j]) Je ne connaissais pas, merci.

    Citation Envoyé par Sve@r Voir le message
    Absolument pas. Tout est nombre en C, y compris les caractères. T'as donc parfaitement le droit de copier un chiffre numérique (au fait, "numérique" par opposition à quoi ? un chiffre "non numérique" ???) dans un char (nombre compris entre 0 et 255). Si le chiffre numérique est trop grand, la copie le tronquera via modulo 255.
    Maintenant si ta question est "est-ce que cette instruction correspond à ce que j'ai dans la tête", la réponse dépend alors de ce que tu as dans la tête et ça on peut pas le deviner...
    Merci pour l'info, mes chiffres montent à 65 max donc le problème de trancature ne se pose pas.
    Mon but est de stocker un chiffre venant d'un tableau INT dans un tableau CHAR pour ainsi pouvoir l'utiliser dans CheminImage via sprintf (je me suis dit que c'etait necessaire de convertir INT en CHAR puisque CheminImage est une chaine de caractères)

    Après quelques test, il me semble que l'erreur se trouve dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(CheminImage, "img/tuiles/%s/.png", cmainj1[j])
    car lorsque je compile avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(CheminImage, "img/tuiles/10.png")
    mon programme a l'air de bien marcher !

    L'erreur est encore un soucis de mémoire : 0xC0000005

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/12/2006, 17h33
  2. Probleme strcat et strcpy
    Par grincheux01 dans le forum C
    Réponses: 6
    Dernier message: 25/04/2006, 12h07
  3. [Technique] Index, comment font les moteurs de recherche ?
    Par bat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 25/10/2002, 15h41
  4. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53
  5. TextOut : comment changer de font
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 15/07/2002, 20h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo