La mémoire ne peut pas être "written" [Résolu]

Nao13090 5 Messages postés vendredi 20 mai 2011Date d'inscription 26 mai 2011 Dernière intervention - 20 mai 2011 à 14:38 - Dernière réponse : Nao13090 5 Messages postés vendredi 20 mai 2011Date d'inscription 26 mai 2011 Dernière intervention
- 25 mai 2011 à 14:36
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 :

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 !
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
cptpingu 3807 Messages postés dimanche 12 décembre 2004Date d'inscription 21 septembre 2018 Dernière intervention - 21 mai 2011 à 11:24
3
Merci
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 http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cptpingu
Nao13090 5 Messages postés vendredi 20 mai 2011Date d'inscription 26 mai 2011 Dernière intervention - 25 mai 2011 à 14:36
0
Merci
Celà marche très bien en utilisant non plus des char * mais des QString, ça facilite beaucoup les choses !
Je te remercie vivement
Commenter la réponse de Nao13090

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.