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

SL & STL C++ Discussion :

[Débutant] Bug 0xC0000005 en utilisant des ofstream


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut [Débutant] Bug 0xC0000005 en utilisant des ofstream
    D'abord bonjour à tous

    Pour la petite histoire, j'avais écris un bon gros paté de programme, que je voulais modifier à grand peine. Je me suis fait greffé 4 neuronnes, et j'en ai fait des sous-programmes (pas con le mec!). Et là, c'est avec une joie non dissimulée (mais quand même non visible peut-être parce que "non-existante") que mon programme ne marche plus!

    Globalement, j'ai une erreur 0xC0000005 : access violation depuis que mon programme a muté en :
    Appel de la fonction dans une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=1;i<=3;i++)
    {
    	cout<<"Dossier : "<<i<<"/3<<endl;
    		Hoehe_des(i, Temp, SektorenHoehe, SektorenRadius, CheminDossier, CheminDossierRes,Temp_couple);
    }
    (CheminDossier et CheminDossier Res fonctionnent, j'ai enlever des procédures de copies de fichiers, mais les copies se font normalement, au bon endroit).

    Ensuite, j'appelle mes fonctions de copie de lignes, puis j'utilise les ofstream obtenue dans un autre sous programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    coordonnees C1,C2;
    int cas=test(Temp,  OriginHoehe,  OriginRadius);
    ofstream fileCiblHoehe=copie_trois_lignes(CheminDossier, CheminDossierRes);
    ofstream fileCiblRadius=copie_trois_lignes(CheminDossier, CheminDossierRes);
    modif(fileCiblHoehe,fileCiblRadius, OriginHoehe, OriginRadius, C1,C2, Temp);
    cout<<"La";  //<------------ Le "La" est "important" pour la suite
    Enfin (je vous épargne le "copie_trois_lignes"), le modif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void modif(ofstream &file, EnsembleSecteurs Origin, coordonnees C1, coordonnees C2, EnsembleSecteurs &SPb){
    if(SPb!=NULL)
    {
    	C1.dist_unten=SPb->Sektor.eingang_Wdg;
    	//[...]
    	if(Origin!=NULL)
    	{
    		if(Origin->Sektor==1)
    		{file<<"  "<<Origin->Sektor-1<<",    ";
    etc etc etc}
    }
    Ce que je ne comprend pas, c'est que le bug intervient après la procédure "modif", au niveau de "La" [il s'affiche] (ou plutôt juste après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"Dossier : "<<i<<"/3"<<" -----------------------------"<<endl;
    n'affiche rien!) Et aussi et surtout, que la procédure modif se déroule (puis bug) mais qu'elle n'a rien écris dans mes fichiers, comme si dans "modif", le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ofstream] file<<"quelquechose";
    ne marchait pas!

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Avec ce code, tu écris vraissemblablement pas au bon endroit, et c'est un problème avec tes streams à toi, pas avec les cout, tu peux les enlever totalement, ça ne changera pas le fait que ça plante.

    Essaie de regarder du côté de ta fonction copie_trois_lignes qui doit te retourner un ofstream et qui ne doit sûrement pas le faire...

  3. #3
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut
    Alors je pense aussi que ca peut provenir du "copie_trois_lignes" (du coup je le met quand même).
    Le fond de ma pensée, (puisque peu de choses ont changés depuis la verions initiale "gros paté" qui marchait), c'est que je doit avoir une erreur du type void chaipaquoi(ofstream &F). C'est à dire que le ofstream n'est pas changé à la sortie du programme. Mais je croyais avoir fait ca "Rigoureusement" alors je vois pas trop...
    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
    ofstream copie_trois_lignes(string CheminOrigin, string CheminCible){
     
    char*	Cible=Traduire(CheminCible);
    char*	Origine=Traduire(CheminOrigin);
    string copy;
     
    ifstream fileOrig(Origine);
    ofstream fileCibl(Cible);	
    int n=1;
     
    	while ( (getline(fileOrig , copy))&&(n<=3) )
    	{fileCibl<<copy<<endl;
    			n++;}
    return fileCibl;
    }
    "Traduire" fonctionne et change juste un string en char*
    [Et puis pour les cout... ben heu... comment dire ca ... Débutant oui, mais quand même! C'est juste que je localise encore les erreurs plus facilement avec des cout placés qu'avec le debugger. -> Si j'ai "mes cout" je peux plus facilement "traduire" le debugger Même si j'ai conscience que "Ca peut brouiller... Les cout" désolé]

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tes ofstream n'existent plus quand tu sors de ta fonction, à priori, donc ça ne va sûrement pas marcher.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut
    OK... Je savais pas...
    Donc le plus simple,c'est de rouvrir le même fichier, et d'écrire à la suite [ou de le faire en architecture gros paté...]
    Merci! Je vais mettre le "Résolu", mais si il y a une idée de génie pour récupèrer malgré tout les ofstream (Ca me ferait pas changer mes sous-programmes), ca m'interesse!

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Attends avant de mettre résolu, faut au moins voir si ça marche avant
    Regarde dans ton débuggeur si lors des appels à fileCibl* la structure pointée est bien valable.

  7. #7
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut
    Yes... Je suis revenu de la FAQ spécialement pour ca :
    Alors c'était moins naturel à coder pour moi (de rentrer une string à transformer en deux ofstream plutôt que directement deux ofstream), mais mon "modif" marche nickel comme ca:
    J'écris avec mon "copie_trois_lignes" dans un fichier nouvellement créé ou écrasé, puis je lance "modif".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char*	CibleHoehe=Traduire(CheminDossierRes+"\\Hoehe.des");
    char*	CibleRadius=Traduire(CheminDossierRes+"\\Radius.des");
     
    ofstream fileHoehe(CibleHoehe, ios_base::app );
    ofstream fileRadius(CibleRadius, ios_base::app );
     
    fileRadius<<MesLignes;
    Avec mon "CheminDossierRes modifié" pour mes deux fichiers à écrire et le "std::ios_base::app" pour écrire à la fin, le programme est plus fin qu'au départ et fonctionne.
    Alors comme c'est un programme qui se lance plusieurs fois, je recréé à chaque fois deux ofstream, mais ca ne dépassera pas les vingts déclarations en tout. Comparé au reste de mon programme ca a déjà moins l'air d'être programmé avec des mouffles

    En tout cas merci à toi Miles, parce que j'avais déjà fait des essais il y a quelques mois ou je déclarait des "fstream" et ca marchait comme je voulais (il était bien modifié à la sortie du programme), alors je pensait vraiment que ca poserait pas de problème.
    Et puis bien évidemment, je suis comme toujours preneur d'astuces efficaces si c'est possible!

    [edit]
    Je viens de relire ton post. En fait, pour le debbuger, je ne comprenais pas où se situe l'erreur : les premiers fichiers incriminés sont en langage machine (si j'ai bien compris), et le dernier se situe dans le main. Ca, OK. Donc je cherchais la première de mes fonctions qui buggait. Mais j'avoue ne pas avoir compris si quand le debugger montre une fonction ou un void, et qu'il informe d'un problème, il faut comprendre que la variable à problème à l'appel , à l'execution [ ou autre ?!?]...
    [/edit]

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Les streams ne sont pas copiables. Si ton programme compile c'est que tu utilises probablement <fstream.h>, pour éviter les problèmes tu devrais passer à <fstream>.

    http://c.developpez.com/faq/cpp/?pag...le#SL_iostream

  9. #9
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut
    Alors... les stream ne sont pas copiables... Ca veut dire que je ne peux pas les mettre en résultat d'une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ofstream fontion(string Chemin);
    par exemple.
    Parce que si c'est bien ca, c'est ca que j'ai appris.

    Du coup, je pensait que c'était la bonne méthode que je faisait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*void*/ programme1(/*string*/ Chemin); //copie les trois premières lignes dans un fichier
    /*void*/ modif(/*string*/ Chemin); //rempli les fichiers en écrivant à la suite du fichier
    Je pense que c'est bien ca puisque mon programme compile, qu'il fonctionne comme je veux (pour l'instant ?!!?) et que j'utilise bien <fstream>.
    !?!
    Il y a quelque chose qui m'a échappé ou c'est bien normal que ca fonctionne?!?

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui, cela veut dire (entre autre) que tu ne peux pas renvoyer un ofstream via une fonction. Typiquement, lorsqu'on veut trimballer des flux via des fonctions, on les passe en paramètre par référence.

    Et donc non, ton code ne devrait pas compiler

    Quel compilo utilises-tu, et quelle est sa version ?

  11. #11
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut
    Alors, j'utilise Microsoft Visual C++ 6.0.
    Mais, le truc c'est que dans mon post précédent, je donnait un Contre-Exemple. pour dire ce qui n'était pas possible : je ne me sers pas du tout de ce genre de fonction qui renvoi un ofstream.

    Je vais essayer de le dire encore autrement:
    1 programme me sers pour écrire dans un fichier (grâce à un ofstream en interne créé à partir du CheminFichier en string)
    1 autre programme écris à la fin de ce fichier (grâce à la méhode de la FAQ et du même CheminFichier en string) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ofstream fileRadius(CibleRadius, ios_base::app );
    En fait, on me dit que ca marche pas, mais (et c'est peut être que j'ai mal compris) je pensais vraiment qu'en faisant comme ca, copiable ou pas, le programme devait compiler (puisqu'encore une fois, je ne les copie pas [plus]!).
    Par contre, je vais me renseigner sur les "paramètre par référence". Ca peut servir (d'où le [débutant] dans le titre )

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ah ok... J'avoue que je suis un peu perdu dans tout ce code, entre ce que tu utilises, ce que tu n'utilises pas, ce qui marche, ce qui ne marche pas, ...

    Si tes fonctions ne renvoient pas de flux alors oui c'est bon.

  13. #13
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut
    OK
    Je remet mon "RESOLU", et tout va bien
    Et tant que j'y suis, je vais vraiment faire de mon maximum pour parler clairement! J'ai vraiment du mal à me faire comprendre! ... Après avoir pensé que tout le monde était con sauf moi [Blague], je me rend à l'évidence : Je ne sais pas m'exprimer.
    Merci à Miles et à toi Loulou en tout cas [pis aux autres aussi hein!].

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

Discussions similaires

  1. [+ou- débutant] utilisation des sémaphores
    Par Biosox dans le forum Windows
    Réponses: 4
    Dernier message: 26/05/2008, 12h23
  2. Bug ou mauvaise utilisation des FileUpload?
    Par mael94420 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 03/05/2007, 09h13
  3. Débutant [Utilisation des effets sonores]
    Par QuestionMan dans le forum Multimédia
    Réponses: 1
    Dernier message: 06/03/2007, 10h52
  4. Débutant: Question sur l'utilisation des structures
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/10/2006, 13h03
  5. [Débutant]Utilisation des Threads
    Par maniolo dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 10/07/2006, 11h31

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