Problème d allocation dynamique [Résolu]

Messages postés
2
Date d'inscription
mardi 14 février 2012
Statut
Membre
Dernière intervention
14 février 2012
- - Dernière réponse : Beqtb0x
Messages postés
2
Date d'inscription
mardi 14 février 2012
Statut
Membre
Dernière intervention
14 février 2012
- 14 févr. 2012 à 10:45
/*Bonjour a tous, je viens d'arriver sur ce site, je suis étudiant en première année d'informatique et j'ai un problème a un tp que même la prof n'est pas parvenu a m'expliquer merci de me donner un petit coup de pouce =).

Voici le code lorsque j'affiche les mots du dictionnaire il affiche x fois (dépend du nombre de mots sélectionnés par l'utilisateur) le dernier mot qui a été entré dans la fonction remplir dictionnaire (1) et plus précisément je pense que le problème et que je manipule des pointeur sur objet avec maladresse mais je ne sais pas que faire pour que chaque pointeur pointe bien sur le mot que je désir.

PS : en commentaire les problème au ligne correspondante
*/
#include
#include<string.h>
#include<stdio.h>

using namespace std;


struct mot
{
char*tab;
int nb_synonymes;
int nb_max_synonymes;
char**synonymes;
char*definition;
};

struct dico {
mot **tab;
int taille_max;
int nb_mots;
};

char* saisir_chaine()
{
char*s , buffer[1024];
int x;

cin.getline(buffer,1024);
x=strlen(buffer)+1;
s=new char[x];
strcpy(s,buffer);

return s;
}

void afficher_mot(mot *m)
{
cout<<"Mot : "<<m->tab<<endl<<endl;
cout<<"Définition : "<<endl<<m->definition<<endl<<endl;


cout<<"Synonymes : "<<endl<<m->synonymes[0];
for(int i=1;i<m->nb_synonymes;i++)
cout<<", "<<m->synonymes[i];

cout<<"."<<endl<<endl;
}

mot* saisir_mot()
{
mot *m;

cout<<"Veuillez donner votre mot :";
m->tab=saisir_chaine();

cout<<"Donnez votre definition :";
m->definition=saisir_chaine();
do
{
cout<<"Donner le nombre de synonymes"<<endl;
cin>>m->nb_synonymes;

cout<<"Donnez le nombre max de synonymes :"<<endl;
cin>>m->nb_max_synonymes;

m->synonymes = new char*[m->nb_synonymes];

if(m->nb_synonymes>m->nb_max_synonymes)
cout<<"Erreur ressaisissez"<<endl<<endl;

}
while(m->nb_synonymes > m->nb_max_synonymes);

for (int i=0 ;i<m->nb_synonymes ; i++)
{
cout<<"Donnez le synonyme no "<synonymes[i]=saisir_chaine();
}

return m; <--- ce retour et peu être faux ?

}

dico* remplir_dico()
{
dico* d;

cout<<"Donnez la taille du dictionnaire : ";
cin>>d->taille_max;

d->tab = new mot*[d->taille_max];

cout<<"Combien voulez vous entrer de mots : ";
cin>>d->nb_mots;

for(int i=0 ; i< d->nb_mots ;i++)
{

fflush(stdin);
d->tab[i]=saisir_mot();// c'est cette ligne qui pose problème le dernier pointeur renvoyé se copie dans TOUTES les cases qui le précèdes
}

return d;

}

void afficher_dico(dico* d)
{

cout<<"Taille du dictionnaire : "<<d->taille_max<<endl;


cout<<"Nombre de mots : "<<d->nb_mots<<endl;


for(int i=0;i< d->nb_mots ;i++)
{
cout<<"Mot "<tab[i]);

}

}



int main()
{
dico *d;

d=remplir_dico();
afficher_dico(d);

return 0;
}
//Merci par avance pour votre aide
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
56
3
Merci
cout<<"Synonymes : "<<endl<<m->synonymes[0];
for(int i=1;i<m->nb_synonymes;i++)
cout<<", "<<m->synonymes[i];

pas bon, tu pars ici du principe que tu as au moins un synonyme...

faire plutôt :

if (m->nb_synonymes>0) {
    cout<<"Synonymes : "<<endl;
    for(int i=0;i<m->nb_synonymes;i++)
        cout<<", "<<m->synonymes[i];
}


a quoi sert nb_max_synonymes, ca semble assez maladroit et confus (lourd?) a la saisie

où instancies tu ton dico (remplir_dico) ?
idem pour mot dans saisir_mot...

j'ai fait le test, cela fonctionne bien..

#include 
#include <string.h>
#include <stdio.h>

using namespace std;

struct mot {
char*tab;
int nb_synonymes;
char**synonymes;
char*definition;
};

struct dico {
mot **tab;
int taille_max;
int nb_mots;
};

char* saisir_chaine() {
char*s , buffer[1024];
int x;

cin.getline(buffer,1024);
x=strlen(buffer)+1;
s=new char[x];
strcpy(s,buffer);

return s;
}

void afficher_mot(mot *m) {
cout<<"Mot : "<<m->tab<<endl<<endl;
cout<<"Définition : "<<endl<<m->definition<<endl<<endl;

if (m->nb_synonymes>0) {
cout<<"Synonymes : "<<endl<<m->synonymes[0];
for(int i=1;i<m->nb_synonymes;i++)
cout<<", "<<m->synonymes[i];
}

cout<<"."<<endl<<endl;
}

mot* saisir_mot() {
    mot *m = new mot;

cout<<"Veuillez donner votre mot :";
m->tab=saisir_chaine();

cout<<"Donnez votre definition :";
m->definition=saisir_chaine();

cout<<"Donner le nombre de synonymes"<<endl;
cin>>m->nb_synonymes;

m->synonymes = new char*[m->nb_synonymes];

for (int i=0 ;i<m->nb_synonymes ; i++) 	{
cout<<"Donnez le synonyme no "<synonymes[i]=saisir_chaine();
}

return m;
}

dico*  remplir_dico() {
    dico* d = new dico;

    cout<<"Donnez la taille du dictionnaire : ";
    cin>>d->taille_max;

    d->tab = new mot*[d->taille_max];

    cout<<"Combien voulez vous entrer de mots : ";
    cin>>d->nb_mots;

    for(int i=0 ; i< d->nb_mots ;i++) {
        fflush(stdin);
        d->tab[i]=saisir_mot();
    }

    return d;
}

void  afficher_dico(dico* d) {
    cout<<"Taille du dictionnaire : "<<d->taille_max<<endl;
    cout<<"Nombre de mots : "<<d->nb_mots<<endl;

    for(int i=0;i< d->nb_mots ;i++) {
        cout<<"Mot "<tab[i]);
    }
}

/**mot cherche_mot(dico* d, mot &mot )
{
    mot *m;

    for(i=0;i<d->nb_mots;i++)
    {
        if( )
return m;

    }

}
*/


int main(int argc, char** argv) {
    dico *d;

    d=remplir_dico();
    afficher_dico(d);

getchar();
    return 0;
}


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
56
3
Merci
enfin, tu noteras que j'ai ajouté
dico* d = new dico;
et
mot* m = new mot;

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
2
Date d'inscription
mardi 14 février 2012
Statut
Membre
Dernière intervention
14 février 2012
0
Merci
Mais bien sur je n'avais pas allouer l'espace pour le mot et le dictionnaire merci beaucoup pour votre aide surtout avec une tel rapidité je reviendrais =).

PS : le nombre max est a mettre (énoncé de l'exercice) bien que je suis d'avis qu il ne sert pas a grand chose.

Bonne continuation,
Commenter la réponse de Beqtb0x