begin process at 2012 05 30 04:13:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

La mémoire ne peut pas être "written"


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

La mémoire ne peut pas être "written"

vendredi 20 mai 2011 à 14:38:02 | La mémoire ne peut pas être "written"

Nao13090

Bonjour à tous !

Dans le cadre de mon projet de gestion de tournoi, j'ai créer via Qt une fenêtre visant à éditer les participants ajoutés au préalable (c'est à dire modifier nom, prénom, pseudo, team..)
Pour le nom tout fonctionne bien mais lorsque je veux éditer le prénom ou pseudo, une erreur
"Linstruction à 0x77c17b19 emploie la mémoire 0x00000000, la mémoire ne peut pas être "written"
Je ne sais pas d'où celà provient, voici le code s'il peut vous être utile :

Code C/C++ :
void eparticipants::sltEdit()
{
    Participant *e;
    e = new Participant;
    QString qspart = ui->LineEP->text();
    char * argnom;
    char * argprenom;
    char * argpseudo;
    char * argnomteam;
    QString qsnom = ui->LineENom->text();
    QString qsprenom =ui->LineEPrenom->text();
    QString qspseudo = ui->LineEPseudo->text();
    QString qsteam = ui->LineETeam->text();

    if(ui->LineENom->text().isEmpty())
        argnom = e->getNom();
    if(ui->LineEPrenom->text().isEmpty())
        argprenom = e->getPrenom();
    if(ui->LineEPseudo->text().isEmpty())
        argpseudo = e->getPseudo();
    if(ui->LineETeam->text().isEmpty())
        argnomteam = e->getNomTeam();
    ifstream FILE_1("participants",ios::binary|ios::in);
    ofstream FILE_2("P2",ios::binary|ios::out);
    FILE_1.read((char *)e, sizeof(Participant));
    while (e->getPrenom()!=qspart && e->getPseudo() != qspart && e->getNom() != qspart && !(FILE_1.eof()))
       {
         FILE_2.write((char *)e, sizeof(Participant));
         FILE_1.read((char *)e, sizeof(Participant));
       }
    FILE_1.read((char *)e, sizeof(Participant));
    while (!FILE_1.eof())
          {
                FILE_2.write((char *)e, sizeof(Participant));
                FILE_1.read((char *)e, sizeof(Participant));
          }
    FILE_2.close();
    FILE_1.close();

    ifstream FILE_3("P2",ios::binary|ios::in);
    ofstream FILE_4("participants",ios::binary|ios::out);
     FILE_3.read((char *)e, sizeof(Participant));
        while(!FILE_3.eof())
        {
             FILE_4.write((char *)e, sizeof(Participant));
             FILE_3.read((char *)e, sizeof(Participant));
        }
        FILE_3.close();
        FILE_4.close();

        if(!(qsnom.isEmpty()))
        {
            strncpy (argnom, qsnom.toUtf8().data(),qsnom.length());
            argnom[qsnom.length()]='\0';
        }
        if(!(qsprenom.isEmpty()))
        {
            strncpy (argprenom, qsprenom.toUtf8().data(),qsprenom.length());
            argprenom[qsprenom.length()]='\0';
        }
        if(!(qspseudo.isEmpty()))
        {
            strncpy (argpseudo, qspseudo.toUtf8().data(),qspseudo.length());
            argpseudo[qspseudo.length()]='\0';
        }
        if(!(qsteam.isEmpty()))
        {
            strncpy (argnomteam, qsteam.toUtf8().data(),qsteam.length());
            argnomteam[qsteam.length()]='\0';
        }
        Participant *a;
       a = new Participant;
    ofstream FILE_ECRI("participants",ios::binary|ios::app);
    if(!a->enregParticipant(argnom, argprenom, argpseudo, argnomteam))
          QMessageBox::critical(this, "Edition", "Erreur de modification du participant");
     if(FILE_ECRI.write((char *)a, sizeof(Participant)))
        QMessageBox::information(this,"Edition","participant modifié avec succès!");
     FILE_ECRI.close();
     remove("P2");
     QDialog::hide() ;
}


Voila en espérant que vous pourrez me débloquer je vous remercie à l'avance !
samedi 21 mai 2011 à 11:24:59 | Re : La mémoire ne peut pas être "written"

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !

char * argnom;


Tu es en C++, pourquoi ça ???? Utilises un std::string ou un QString...
En plus, on initialise toujours ses variables (au minimum tu devais avoir: char* argnom = 0;)

argnom = e->getNom();


Si getNom() retourne un char*, c'est dangereux... Parce qu'un char* n'est pas copié, seul le pointeur l'est. Donc tu as deux pointeurs qui partagent le même espace mémoire. Si l'un des deux détruits cet espace, l'autre se retrouve avec des données corrompues.

strncpy (argnom, qsnom.toUtf8().data(),qsnom.length());


Aucune chance que ça fonctionne. argnom n'as pas de mémoire alloué (via malloc). Donc tu copies sur un espace mémoire aléatoire, d'où ton erreur potentiel.

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mercredi 25 mai 2011 à 14:36:47 | Re : La mémoire ne peut pas être "written"

Nao13090

Celà marche très bien en utilisant non plus des char * mais des QString, ça facilite beaucoup les choses !
Je te remercie vivement


Cette discussion est classée dans : file, char, participant, ios, if


Répondre à ce message

Sujets en rapport avec ce message

conversion [ par coyotedef ] salut!!lors de la compilation de mon code une erreur apparait. impossible de trouver un remede. "cannot convert parameter 1 from 'char [10]' to 'char' Hachage fermé problème de lecture [ par mcflysupersonic ] Bonjour je suis nouveau sur le forum est ceci est ma première question donc j'espère que je ne me suis pas trompé d'endroit pour poster.Voilà j'ai un Erreurs de compilations bizarres avec Visual C++ 6 [ par VTS_35 ] Bonjour,G encore des problèmes de compilation avec mon programme. Je me suis rendu compte que le programme allait devenir balaise, alors j'ai décidé d Problème copie de fichier.... [ par Clonk ] Bonjour,Je voudrais copier un fichier texte dans mon appli, j'ai fais la fonction suivante://Copie d'un fichier (création du backup)int copier(char * f print allocation de memoir [ par sodival ] /* Je souhaiterai écrire le contenu texte d'une variable char dans un fichier, comment faire ?J'ai pri ce code, mais il me comble les espaces non ecri Probleme de lecture de BMP [ par handmousemaster ] Bonjour à tous, j'ai un probleme :je souhaite lire des fichier BMP, je n'ai aucun probleme pour lire les entetes, mais dès que je veux lire les donnée desalocation char** foireuse [ par MuPuF ] Bonjour, j'ai un probleme d'allocation/désalloc mémoirevoila la bete :char** File.PMD5;//AloueFile.PMD5=new char*[File.NumHash];    for(unsigned int i prob de Class [ par T_Mehdi ] salut a tous^^bon j'ai 2 classe  :class C_Load_File{ C_Load_File(); ~C_Load_File();public : bool Load_Bmp(char* File); bool Load_Jpg(char *File);};cla Fichiers .jpg [ par StevenJLMunn ] Bonjour à tous, je voudrais faire un crypteur de fichier .jpg.Pour faire cela je fais déja des essai il faut ke je puisse lire le fichier .jpg en mode les fichiers [ par infodaoudi ] bonjour codeurj'ai la fonction suivantevoid Noeud::insererNF(char *fich,Noeud *ng){        ofstream A(fich,ios::out|ios::app|ios::binary);    if (!A)


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales