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++/CLI Discussion :

fwrite() fonctionne en Debug et plante en release


Sujet :

C++/CLI

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 115
    Points : 47
    Points
    47
    Par défaut fwrite() fonctionne en Debug et plante en release
    Bonjour à tous,

    Je développe actuellement un programme qui lit des données d'un fichier et les stock dans différent fichier, voici une portion 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
     
    //initialisation
    FILE ** tiles = (FILE **)malloc((NbrOfTiles)*sizeof(FILE*));
    ......
    //Ouverture des fichiers
    ...........
    //Remplissage des fichiers
    for(int i = 0; i < Ligne; i++)
       for(int k = 0; k < nbrLigne; k++)
    	for(int j = 0; j < Colonne; j++){
    	fread(buffer, sizeof(BYTE), PasLigne, file);
    	fwrite(buffer , sizeof(BYTE), PasLigne, tiles[j+PasLigne*i]); 
            }
    Le problème que mon code s'exécute le plus normalement du mode en mode debug mais une fois en mode release il généré une exception
    violation d'accées lors de l'écriture.
    Ce que je n'arrive pas à comprendre c'est qu'il commence à écrire dans les fichier puis c'est l'erreur

    je serai très reconnaissante pour ceux qui peuvent m'aider
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    Il n'y a pas assez de code pour identifier précisément ton problème. Tu dois certainement avoir soit un écrasement soit un adressage invalide.

    La solution la plus sur est de remplacer ces allocations dynamiques par std::vector<std::vector<FILE> > (ou CArray<CArray<FILE> > si tu veux rester MFC), ça t'éviteras les problèmes de gestion explicite des pointeurs (toujours problématique) et ça t'avertiras en mode debug d'éventuels dépassement.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    C'est du code qui pique les yeux. Il sent le faisandé d'il y a 40 ans.

    La ligne où est l'erreur ?
    La valeur des variables locales ?

    Bon, comme ma boulle de cristal est en révision, on ne va émettre que des hypothèses purement gratuites.

    "buffer" est mal initialisé (trop court), cela marche en Debug et pas en Release à cause de la présence du "canarie" en fin de bloc alloué en mode Debug.

    "buffer" est initialisé à null, car on utilise une variable non ou mal initialisé comme longueur, cela marche en Debug et pas en Release car les variables en Debug sont automatiquement initialisés à zero donc une allocation de la taille du canarie et en Release allocation d'un bloc trop grand et donc retour d'un null comme indicateur d'erreur.

    "j+PasLigne*i < NbrOfTiles" c'est sûr ça ?

    P.S.: malloc peut retourner null, il faut le vérifié.
    P.P.S.: fread et fwrite retournent des valeurs et c'est pas juste pour faire jolie.
    P.P.P.S.: pour les tableaux c'est calloc, pas malloc. (alignement tout ça )

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 115
    Points : 47
    Points
    47
    Par défaut
    Merci bacelar et 3DArchi, comme vous avez dit l'erreur est du à un problème d'allocation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tile = (STile *)malloc((NbrOfTiles)*sizeof(STile)); //j'alloue un espace pour Tile sans que j'initialise la variable NbrOfTiles
    Merci encore les amie

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/02/2015, 15h18
  2. Réponses: 5
    Dernier message: 20/09/2014, 07h36
  3. programme fonctionne en debug mais pas en release ?
    Par membreComplexe12 dans le forum C++
    Réponses: 20
    Dernier message: 16/05/2012, 11h52
  4. Fonctionne en Debug mais pas en Release
    Par Baud10 dans le forum MFC
    Réponses: 23
    Dernier message: 04/02/2008, 15h17
  5. Ca marche en Debug, ca plante en Release
    Par loupdeau dans le forum MFC
    Réponses: 12
    Dernier message: 08/06/2005, 15h53

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