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 :

[C++] Bug Tableau


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 12
    Points : 9
    Points
    9
    Par défaut [C++] Bug Tableau
    Bonjour,

    J'ai un un bug vraiment bizarre :
    - Lorsque je remplis mon premier tableau "tab" jusque la valeur 27, mon tableau "phrase" s'affiche correctement.
    - Mais lorsque je remplis mon premier tableau "tab" jusque la valeur 27 incluse ou strictement inférieur à 28, alors dans mon tableau "phrase", la 1ère lettre en l'occurence le "b" ici disparait ...

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
     
    using namespace std;
     
    int fct_count(char* ph)
    {
    	int i = 0;
    	while (ph[i] != '\0')
    		i++;
    	return (i);
    }
     
    int main(void)
    {
    	int tab[27];
    	char phrase[] = "bonjour le monde";
     
    	int nb = fct_count(phrase);
     
    	for (int i = 0; i <= 27; i++)
    		tab[i] = 0;
     
    	for (int y = 0; y < nb; y++)
    		cout << phrase[y];
     
    	return (0);
    }
    Une fois compilé ce code affiche exactement : " onjour le monde" (un espace au lieu d'un b)

    Merci d'avance pour votre aide

    Cordialement, Flo FR

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Il n'y a rien de bizarre, tu itères 28 fois sur un tableau de 27 cases ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Réponse simple:
    Compte les nombres entre 0 et 27 inclus.

    Réponse longue:
    La première ligne du main, int tab[27], déclare un variable locale qui est un tableau de 27 int. C'est à dire que les 27 premiers ints de la pile seront tab.
    La ligne suivante, char phrase[] = "bonjour le monde" déclare un tableau de caractères. Le compilateur les places sur la première case de la pile, donc au bout de tab.

    Le for (int i = 0; i <= 27; i++) tab[i] = 0; mets 0 dans les éléments de tab[0] à tab[27], inclus.
    C'est là que la réponse courte intervient.

    tab[27], c'est 27 * sizeof(int) plus loin que tab[0].
    C'est à dire que c'est le 28° int de la pile.
    Manque de chance, ce n'est plus dans tab, mais le début de phrase.

    C'est un "buffer overflow", fait manuellement. C'est une erreur pouvant mener, dans d'autres situations, à des failles de sécurité graves (raison pour laquelle gets() est interdite)
    La solution, c'est de toujours utiliser < pour un tableau dans les boucles for. Ici, ca donnerait for (int i = 0; i < 27; i++) tab[i] = 0;;

    Par contre, ta fonction auxiliaire n'a d'utilité que pour l'exercice, vu qu'il existe strlen pour ca, si on reste avec les char*.
    Le mieux étant d'utiliser std::string (dans <string>, ou en général dans <iostream>)

    Par ailleurs, le cout peut aussi s'écrire sans boucle en profitant qu'un char[] soit convertible en char*: cout << phrase << endl;.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    En effet, j'étais sûr que c'était une erreur débile, je sais pas pourquoi mais je pensais que mon tableau était de taille 28 (dans ma tête j'avais machinalement compté de 0 à 27).

    Merci pour ton aide

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci leternel pour le complément d'information et l'astuce pour éviter les "buffer overflow".
    Pour ce qui est de strlen, je n'ai même pas fait ça dans le cadre de mon exercice mais j'avais besoin d'une fonction pour compter et vu que ça fait un petit moment que je n'ai pas codé, je n'ai pas pensé à utiliser strlen.

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

Discussions similaires

  1. Bug tableau hexadecimal?
    Par kimjoa dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/08/2012, 20h03
  2. [BUG] Tableau de bord
    Par dafpp dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 26/05/2012, 11h20
  3. Problème ou bug ? Tableau dans une boucle
    Par nico1811 dans le forum Ruby
    Réponses: 12
    Dernier message: 25/01/2010, 09h50
  4. Bug tableau a 2 dimension
    Par nifrou dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/12/2007, 00h20
  5. [HTML] Bug tableau
    Par Cedrun dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/11/2006, 18h50

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