Problème d allocation dynamique

Résolu
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 à 00:58
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

3 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 févr. 2012 à 08:17
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 févr. 2012 à 08:20
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
3
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
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,
0
Rejoignez-nous