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 :

Plantages 1 fois sur 3


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    débutant c++
    Inscrit en
    Août 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : débutant c++

    Informations forums :
    Inscription : Août 2015
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Plantages 1 fois sur 3
    Bonjour,

    Je viens de réaliser mon premier programme en C++ à l'aide Code Blocks.
    Il est relativement simple.
    Il consiste à ouvrir un fichier texte, y remplacer une valeur par "1", le réécrire, puis lancer un autre exe.

    Voici le 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <iostream>
    #include <fstream>
    #include <string>       /* find */
    #include <stdio.h>
    #include <stdlib.h>     /* system, NULL, EXIT_FAILURE */
     
    using namespace std;
     
    int main() {
        string nameFile = "C:\\Users\\Clem\\AppData\\Roaming\\Arduino15\\preferences.txt";
        string varFic;
        ifstream fichier(nameFile.c_str(), ios::in);        // on ouvre le fichier en lecture
        if(fichier){                                        // si l'ouverture a réussi
            string contenu;
            string keyword = "sketch.count";                // déclaration d'une chaîne qui contiendra la ligne lue
            string argument;
            while(getline(fichier, contenu)) {              // tant que l'on peut mettre la ligne dans "contenu"
                varFic += contenu + "\n";
            }
            fichier.close();                                // on ferme le fichier
            //printf ("contenu de varFic : \n%s", varFic.c_str());
            size_t argPos = varFic.find(keyword)+keyword.length()+1;
            string prevArgument;
            for (int i = 0; (varFic[argPos + i] != 13); i++) {                // trouve le prochain '\r'
                prevArgument += varFic[argPos + i];
            }
            varFic[argPos] = '1';                           // on remplace l'ancien argument par 1
        }
        else  {
            printf ("Impossible d'ouvrir le fichier en lecture !\n");
        }
        ofstream fichierE(nameFile.c_str(), ios::out | ios::trunc);  // ouverture en écriture avec effacement du fichier ouvert
        if(fichierE) {
            fichierE << varFic;
            fichierE.close();
        }
        else  {
            printf ("Impossible d'ouvrir le fichier en ecriture !\n");
        }
        int cmd=system ("D:\\Maison\\Domotique\\ESP8266\\arduino-1.6.5-r5\\arduino.exe");
        return 0;
    }

    Si je peux entendre toutes remarques (elles seront bienvenues) sur mon style ou ma façon de procéder, je souhaite avant tout savoir pourquoi il plante une fois sur 3.

    Sous Code Blocks, il me retourne le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Process returned -1073741819 (0xC0000005)   execution time : 2.385 s
    Press any key to continue.
    Environnement : Windows 7-64

    Merci d'avance à ceux qui passeront un peu de temps à cette analyse.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Sans certitude, voici mes observations:

    1. en invoquant un autre exe dans ce programme, tu ne peux pas être sûr que c'est bien ton programme et non l'autre exe qui provoque le plantage
    2. en bouclant tant que chaine[arg+i] est différent de '\r' tu prends le risque de dépasser la fin de la chaîne, ce qui provoquerait un plantage.
    3. tu cherches les retours chariots '\r' pour les remplacer par 1 si je ne m'abuse. Je ne sais pas ce que donne ton fichier d'entrée mais la possibilité d'un retour chariot isolé est relativement faible (sauf si tu es sur un vieux apple d'avant osX?). Sous Windows tu aurais des lignes finies par \r\n mais getline fait sauter le séparateur de ligne et tu le remplaces par \n seul. Du coup chercher \r me paraît risqué.

    Donc mon conseil:
    - testes ton programme sans l'appel d'un autre exe pour voir si c'est bien ton programme qui plante
    - utilises la méthode at(i) plutôt que [i] pour être sûr que tu ne dépasses pas les limites de ta chaîne
    - le cas échéant attrape les exceptions qui pourraient être générées et utilise les pour afficher des informations intéressantes
    - et puis tu peux toujours avoir recours à un débogueur

  3. #3
    Membre à l'essai
    Homme Profil pro
    débutant c++
    Inscrit en
    Août 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : débutant c++

    Informations forums :
    Inscription : Août 2015
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Merci stendhal666.

    Je pense que cela vient probablement de ma boucle for (hasardeuse...).

    Merci beaucoup pour ces conseils.

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

Discussions similaires

  1. Requete sur une table qui pointe 2 fois sur une autre
    Par Satch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/01/2006, 08h48
  2. [MySQL] changer de style une fois sur 2 après requête
    Par mussara dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/12/2005, 21h55
  3. le sous formulaire s'affiche une fois sur deux
    Par Math dans le forum Access
    Réponses: 16
    Dernier message: 10/10/2005, 15h25
  4. Plantage SQL Server sur requete de mise a jour
    Par Laurent_75000 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/09/2005, 10h00
  5. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 09h52

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