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

C Discussion :

Problème de pointeur ?


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut Problème de pointeur ?
    Bonjour,
    J'ai une matrice et deux fonctions.
    L'une affiche la matrice =>fonctionne !
    Avec l'autre je vais chercher dans la matrice les coordonnées de la plus petite valeur (mais différente de 0) ... => fonctionne !
    Mais si je demande d'afficher à nouveau la matrice juste après l'application de ma fonction mini, j'obtiens un "segmentation false" !

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    void afficheMat(float (*mat)[5]){
    	int i,j;
    	for (i=0;i<5;i++){
    		for (j=0;j<5;j++){
    			printf("%2.2f  ",mat[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    void mini(float (*mat)[5],int *t){
    //Determination de la distance minimum
       float min=1000.00;
       int i=0,j=0;
       for(i=0;i<5;i++){
           for(j=0;j<i-1;j++){
                if(min>mat[i][j] && mat[i][j]!=0){
                   min=mat[i][j];
                   t[0]=i;
                   t[1]=j;
                   }
               }
           }
    }
    
    int main(){
    	float matrice[5][5]={{0,5,3,1,12},
    		            {5,0,7,5,5},
    		            {3,7,0,5,8},
    			    {1,5,5,0,12},
    			    {12,5,8,12,0}};	   	
    	//pointeur vers la matrice
    	float (*pMatrice)[5]=matrice;	
    	//affiche la matrice
    	afficheMat(pMatrice);
    	//repère le minimum
    	int t[2]={0,0};
    	mini(pMatrice,&t[1]);
    	printf("i=%d et j=%d\n",t[0],t[1]);
    	//affiche la matrice
    	afficheMat(pMatrice);
    	return 0;
    }
    Est-ce un soucis de pointeur ? J'ai du mal à voir pourquoi ça ne fonctionne plus ?
    Si quelqu'un a une idée .... Mici !

    [EDIT] Je viens de réaliser deux tests :
    - faire un affichage directe dans le main (ainsi je n'utilise pas le pointeur) => La matrice s'affiche nickel !
    - déclarer un autre pointeur que j'utilise dans ma fonction affiche => ça marche la fonction affiche ma matrice !

    Résultat le soucis vient bien de mon pointeur mais si je doit créer un pointeur par fonction c'est pas top !!! Comment faire pour que le pointeur soit réutilisable ? [/EDIT]

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Salut,

    cette ligne me parait suspecte :
    En effet tu passes à la fonction l'adresse du deuxième élément de ton tableau et donc quand , dans la fonction mini, tu fais :
    tu écris en dehors de ton tableau ce qui peut corrompre l'état de la pile.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    Bonjour,
    J'ai une matrice et deux fonctions.
    L'une affiche la matrice =>fonctionne !
    Avec l'autre je vais chercher dans la matrice les coordonnées de la plus petite valeur (mais différente de 0) ... => fonctionne !
    Mais si je demande d'afficher à nouveau la matrice juste après l'application de ma fonction mini, j'obtiens un "segmentation false" !
    Ce code est beaucoup trop compliqué...

    http://emmanuel-delahaye.developpez.....htm#param_tab

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <stdio.h>
     
    void afficheMat (float mat[][5])
    {
       int i, j;
       for (i = 0; i < 5; i++)
       {
          for (j = 0; j < 5; j++)
          {
             printf ("%2.2f  ", mat[i][j]);
          }
          printf ("\n");
       }
    }
     
    void mini (float mat[][5], int *t)
    {
    //Determination de la distance minimum
       float min = 1000.00;
       int i = 0, j = 0;
       for (i = 0; i < 5; i++)
       {
          for (j = 0; j < i - 1; j++)
          {
             if (min > mat[i][j] && mat[i][j] != 0)
             {
                min = mat[i][j];
                t[0] = i;
                t[1] = j;
             }
          }
       }
    }
     
    int main (void)
    {
       float matrice[5][5] = {
          {0, 5, 3, 1, 12},
          {5, 0, 7, 5, 5},
          {3, 7, 0, 5, 8},
          {1, 5, 5, 0, 12},
          {12, 5, 8, 12, 0}
       };
     
       //affiche la matrice
       afficheMat (matrice);
       //repère le minimum
       int t[2] = { 0, 0 };
       mini (matrice, t);
       printf ("i=%d et j=%d\n", t[0], t[1]);
       //affiche la matrice
       afficheMat (matrice);
       return 0;
    }

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Merci emmanuel je vais tester ça !

    Montag : j'ai vais cette boutade et je l'ai corrigé mais j'ai oublié de le corriger sur le post

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    C'est bon ! Merci bien emmanuel

    Autre question : je cherche un bon tuto sur les doubles listes chaînées. J'ai cherché pas mal sur google mais je trouve des trucs pas bien claire (-_-)"

    Si vous avez des pistes ? Mici !

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    Autre question : je cherche un bon tuto sur les doubles listes chaînées.
    http://nicolasj.developpez.com/articles/listedouble/

    Mais si tu connais les listes chainées simples, les listes doubles, c'est juste un peu plus complexe (maintenir 2 pointeurs au lieu d'un seul), mais le principe est le même. Y'a plus (+) besoin de matière grise que de tutoriel... (juste un exposé du principe de base du chainage double, c'est tout...)

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Mais si tu connais les listes chainées simples, les listes doubles, c'est juste un peu plus complexe (maintenir 2 pointeurs au lieu d'un seul), mais le principe est le même. Y'a plus (+) besoin de matière grise que de tutoriel... (juste un exposé du principe de base du chainage double, c'est tout...)
    Merci pour le lien
    J'ai du mal à savoir comment les reliés, je tente de construire un arbre de type arbre de distance en phylogénie ... je vais lire le lien que tu m'a transmis dans l'espoir d'être inspiré ....

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    un arbre de type arbre de distance en phylogénie
    mot savant détectaid

    not enough brain cells to launch the process

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Oups désolée

    Une autre question :
    J'ai une chaîne de caractères => chaine=a b c d e
    Y a t'il un moyen pour la transformé en chaine={"a","b","c","d","e"} ?

    Mici (^_^)

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    J'ai une chaîne de caractères => chaine=a b c d e
    Y a t'il un moyen pour la transformé en chaine={"a","b","c","d","e"} ?
    Tu veux dire en une série de petites chaines ? Oui mais est-ce bien utile ? Essaye de décrire le contexte. Il y a peut être plus simple...

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    En faite j'ai récupéré la première ligne d'un fichier dans une chaine de caractère.
    Cette chaine contient 'a b c d e'. Maintenant j'aimerai mettre tout ça dans un tableau, en gros faire un split sur les espaces pour avoir "a","b","c","d","e".
    C'est pour l'utiliser plus tard dans d'autres fonctions.

    Pour être plus précis au lieu de taper ma matrice en dure je vais la récupérer dans un fichier où la première correspond aux noms des colonnes et lignes de la matrice et le reste du fichier la matrice elle-même.
    Contenu du fichier :
    a b c d e
    0 5 3 1 12
    5 0 7 5 5
    3 7 0 5 8
    1 5 5 0 12
    12 5 8 12 0
    Voily ! j'espère que c'est plus claire ... j'avoue avoir tendance à rendre les choses compliquées

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    En faite j'ai récupéré la première ligne d'un fichier dans une chaine de caractère.
    Cette chaine contient 'a b c d e'. Maintenant j'aimerai mettre tout ça dans un tableau, en gros faire un split sur les espaces pour avoir "a","b","c","d","e".
    C'est pour l'utiliser plus tard dans d'autres fonctions.

    Pour être plus précis au lieu de taper ma matrice en dure je vais la récupérer dans un fichier où la première correspond aux noms des colonnes et lignes de la matrice et le reste du fichier la matrice elle-même.
    Contenu du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a   b   c   d   e
    0  5  3  1  12
    5  0  7  5   5
    3  7  0  5   8
    1  5  5  0   12
    12 5  8 12  0
    Tu peux utiliser une tableau de pointeurs (taille à calculer au prealable ou à ajuster au fur et à mesure avec malloc()/realloc(), utiliser strtok() ou strtok_r(POSIX.1) pour 'splitter' la chaine et strdup() pour créer une copie de chaque sous-chaines, dont tu sauvegardes l'adresse dans le tableau de pointeurs.

    Selon l'organisation voulue, ça peut être un tableau de pointeurs à une (vecteur) ou à deux dimensions (matrice).

    La taille peut être fixe ou non, ça dépend des détails de spécification des données...

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    kikou ! Mille merci pour ton aide

    j'ai un autre soucis malheureusement :
    - avec le tableau entré en dure j'ai aucun soucis
    - avec le tableau créé à partir du fichier j'ai un noeud en trop et un élément en 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    int nb_mot=0;
    FILE *file;
    char *ligne;
    ligne = malloc (100000 * sizeof (*ligne));
    char *chaine;
    chaine = malloc (100000 * sizeof (*chaine));
    int a=0;
    if((file=fopen("matrice.txt","r"))==NULL){
       	printf("Impossible d'ouvrir le fichier\n");
       	exit(1);
    }
    while(fgets(ligne,100000,file)!=NULL){
       	if(a==0)
       		strcat(chaine,ligne);
       	a++;
    }
    fclose(file);
    printf("test = %s\n",chaine);
    char nom[5][10];
    char *pointeur;
    char *separateur={ " " }; // Le séparateur 
    //premier appel
    pointeur=strtok(chaine,separateur);
    strcpy(nom[0],pointeur);
     
    while(pointeur!=NULL){
          //cherche les autres separateur
          pointeur = strtok( NULL, separateur );
          if( pointeur != NULL ){
    		nb_mot++; // increment du nombre de mot
    		printf ("Mot de la phrase numero : %d %s\n",nb_mot, pointeur);
    		strcpy(nom[nb_mot],pointeur);
    	}
    }
     
    printf("-----------------------------------------\n");
    int i;
    for(i=0;i<5;i++){
    	printf("%s\n",nom[i]);
    }
     
    Noeud * feuille[5];
    for(i=0;i<5;i++){	
    	//cree le noeud
    	char name[5];
    	strcpy(name,nom[i]);
    	feuille[i] = newNoeud(name);
    	printf("test=%s\n",feuille[i]->valeur);
    }
    Je vois pas trop pourquoi il va trop loin lors du remplissage de tableau ! Il y a un équivalent du pop de perl en C ?

    Mici d'avance pour l'aide apportée !

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    - avec le tableau entré en dure j'ai aucun soucis
    - avec le tableau créé à partir du fichier j'ai un noeud en trop et un élément en trop !!!

    <...>
    Je vois pas trop pourquoi il va trop loin lors du remplissage de tableau
    Il y a plusieurs problèmes dans ce code.

    • Il n'est pas complet
    • Lors de l'appel a strcat(), chaine n'a pas été initialisé. Le comportement est indéfini. Vu qu'il n'y a qu'un appel, pourquoi strcat() et non strcpy() ?
    • Pourquoi des tableaux dynamiques de taille fixe aussi grands (10000 char) pour un fichier aussi petit (6 lignes de 20 colonnes environ) ?

    J'ai donc reconstruit le code ligne à ligne et ça donne ça :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
     
    #define NELEM(a) (sizeof(a)/sizeof*(a))
     
    typedef struct
    {
       char *valeur;
    }
    Noeud;
     
    Noeud *newNoeud (char const *valeur)
    {
       Noeud *this = malloc (sizeof *this);
       if (this != NULL)
       {
          static const Noeud z = { 0 };
          *this = z;
     
          this->valeur = strdup (valeur);
       }
       return this;
    }
     
    void deleteNoeud (Noeud * this)
    {
       if (this != NULL)
       {
          free (this->valeur);
          free (this);
       }
    }
     
    int main (void)
    {
    #define FNAME "matrice.txt"
     
       FILE *file = fopen (FNAME, "r");
       if (file != NULL)
       {
          char chaine[32];
          {
             int a = 0;
             char ligne[32];
             while (fgets (ligne, sizeof ligne, file) != NULL)
             {
                if (a == 0)
                {
                   strcpy (chaine, ligne);
                }
                a++;
             }
          }
          fclose (file);
     
          printf ("test = %s\n", chaine);
     
          {
             char nom[5][10];
             /* Le séparateur */
             char const *separateur = " ";
             /* premier appel */
             char *pointeur = strtok (chaine, separateur);
             size_t nb_mot = 0;
     
             strcpy (nom[nb_mot], pointeur);
             /* increment du nombre de mot */
             nb_mot++;
     
             while (pointeur != NULL)
             {
                /* cherche les autres separateur */
                pointeur = strtok (NULL, separateur);
                if (pointeur != NULL)
                {
                   printf ("Mot de la phrase numero : %d %s\n", nb_mot, pointeur);
                   assert (nb_mot < NELEM (nom));
                   strcpy (nom[nb_mot], pointeur);
                   /* increment du nombre de mot */
                   nb_mot++;
                }
             }
     
             printf ("-----------------------------------------\n");
             {
                size_t i;
                for (i = 0; i < NELEM (nom); i++)
                {
                   printf ("%s\n", nom[i]);
                }
             }
     
             {
                Noeud *feuille[NELEM (nom)];
                size_t i;
                for (i = 0; i < NELEM (nom); i++)
                {
                   /* cree le noeud */
                   char name[5];
                   strcpy (name, nom[i]);
                   feuille[i] = newNoeud (name);
                   printf ("test=%s\n", feuille[i]->valeur);
                }
     
                for (i = 0; i < NELEM (nom); i++)
                {
                   deleteNoeud (feuille[i]);
                }
             }
          }
       }
       else
       {
          perror (FNAME);
       }
     
       return 0;
    }
    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
    16
    17
    18
    19
    20
    21
    22
    23
     
    test = a   b   c   d   e
     
    Mot de la phrase numero : 1 b
    Mot de la phrase numero : 2 c
    Mot de la phrase numero : 3 d
    Mot de la phrase numero : 4 e
     
    -----------------------------------------
    a
    b
    c
    d
    e
     
    test=a
    test=b
    test=c
    test=d
    test=e
     
     
    Press ENTER to continue.
    Ca me parait bien compliqué et je trouve que ça fait beaucoup de copies pour un résultat aussi faible.

    Il doit y avoir une raison qui m'échappe...

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Mici pour le coups de pouce je vais testé ...
    Je sais pas non plus pourquoi j'ai mis strcat au lieu de strcpy ?

    Voici le code sans la lecture dans le fichier :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
      /******************/
     /* Les structures */
    /******************/
     
    //structure noeud
    typedef struct noeud{
      char valeur[10];
      struct noeud * droite;
      int fg;
      struct noeud * gauche;
      int fd; 
    }Noeud ;
     
     
      /*************************/
     /* Fonctions secondaires */
    /*************************/
     
    //Determination de la distance minimum
    void mini(float mat[][5],int *t){
       //variables
       float min=1000.00;
       int i,j;
       //recherche du minimum
       for(i=0;i<5;i++){
           for(j=0;j<i;j++){
                if(min>mat[i][j] && mat[i][j]!=0){
                   min=mat[i][j];
                   t[0]=i;
                   t[1]=j;
                   }
               }
           }
        //affichage test
        printf("La distance min est => %2.2f\n",min);
    }
     
    //Permet d'afficher la matrice
    void afficheMat(float mat[5][5]){
    	int i,j;
    	for (i=0;i<5;i++){
    		for (j=0;j<5;j++){
    			printf("%2.2f  ",mat[i][j]);
    		}
    		printf("\n");
    	}
    }
     
    //Remplit la matrice avec les nouvelles valeurs de distance calculées
    void rempMat(float mat[5][5],int *t){
    	int i,j;
    	int a=t[0];
    	int b=t[1];
       //calcul des distances
       for(i=0;i<5;i++){
           for(j=0;j<5;j++){
           		if((i==a || i==b)&&(j!=a && j!=b)){
           			mat[i][j]=(mat[a][j]+mat[b][j])/2;
           			}
           		if((j==a || j==b)&&(i!=a && i!=b)){
           			mat[i][j]=(mat[i][a]+mat[i][b])/2;
           		}
           }
       }
       for(i=0;i<5;i++){
           for(j=0;j<5;j++){
           		if(i==a || j==a){
           			mat[i][j]=0;
           		}
           }
       }
    }
     
    //fabrique les noeud ou feuilles plutôt !
    Noeud * newNoeud (char *nom){
    	Noeud * a = (Noeud *) malloc(sizeof(Noeud));
      	a->gauche = (Noeud *) NULL;
      	a->droite = (Noeud *) NULL;
    	strcpy(a->valeur,nom);
      	return a;
    }
     
     
    int min2(int a,int b){
      	if(a>b)
      		return b;
      	else
      		return a;
    }
     
    int max2(int a,int b){
      	if(a<b)
      		return b;
      	else
      		return a; 
    }
     
    //crée la liste des noeuds
    Noeud * listNoeud(Noeud * a, Noeud * b) {
      Noeud * c = (Noeud *) malloc(sizeof(Noeud));
      char name[50]="";
      strcat(name,a->valeur);
      strcat(name,b->valeur);
      strcpy(c->valeur,name);
      c->gauche = a;
      c->droite = b;
      return c;
    }
     
    //affiche l'arbre
    void afficheArbre(Noeud * a,int niv){
     
      	if (a->gauche != NULL) 
    		afficheArbre(a->gauche,niv++);
     
      	if (a->droite != NULL)
        	afficheArbre(a->droite,niv++);	
     
      	if (a->droite == NULL && a->gauche == NULL){
      		int i;
      		for(i=0;i<niv;i++)
      			printf("---");
        	printf("a: %s\n", a->valeur);
      	}
    	printf("|\n");
    }
     
     
     
     
      /*********************/
     /* Fonction primaire */
    /*********************/
     
    int main(){	
    	//table des especes
        char nom[][10]= {"f1", "f2", "f3", "f4", "f5"};
     
    	//matrice de distance
    	float matrice[5][5]={{0,5,3,1,12},
    				   {5,0,7,5,5},
    				   {3,7,0,5,8},
    				   {1,5,5,0,12},
    				   {12,5,8,12,0}};
     
    	//affiche la matrice
    	afficheMat(matrice);
     
    	int i,k;
     
      	Noeud * feuille[5];
    	for(i=0;i<5;i++){	
    		//cree les feuilles
    		char name[5];
    		strcpy(name,nom[i]);
    		feuille[i] = newNoeud(name);
    		printf("test=%s\n",feuille[i]->valeur);
    	}
     
    	for(k=0;k<4;k++){
    		//repère le minimum
    		int t[2]={0,0};
    		mini(matrice,t);
    		int a,b;
        	a=min2(t[0],t[1]);
        	b=max2(t[0],t[1]);
    		printf("i=%d et j=%d\n",a,b);
     
    		//regroupe les noeuds
    		feuille[a]=listNoeud(feuille[a], feuille[b]);
    	    for (a=b+1; a<k; a++) {
          		feuille[a-1] = feuille[a];
        	}
    		//remplace la matrice
    		rempMat(matrice,t);	
    	}
     
    	printf("\n------------------------------\n\n");
    	//afficher_arbre(feuille[0],0,5);
    	afficheArbre(feuille[0],0);
     
    	return 0;
    }
    voili ! (^_^)
    Ma fonction d'afficheArbre a des défauts mais je l'améliorerai après

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    Voici le code sans la lecture dans le fichier :
    Mon gestionnaire de mémoire indique que tout n'a pas été libéré...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SYSALLOC Err: Not-matched list:
    SYSALLOC Bloc 003D2448 (28 bytes) malloc'ed at line 80 of 'main.c' not freed
    SYSALLOC Bloc 003D2470 (28 bytes) malloc'ed at line 80 of 'main.c' not freed
    SYSALLOC Bloc 003D2498 (28 bytes) malloc'ed at line 80 of 'main.c' not freed
    SYSALLOC Bloc 003D24C0 (28 bytes) malloc'ed at line 80 of 'main.c' not freed
    SYSALLOC Bloc 003D24E8 (28 bytes) malloc'ed at line 80 of 'main.c' not freed
    SYSALLOC Bloc 003D2510 (28 bytes) malloc'ed at line 104 of 'main.c' not freed
    SYSALLOC Bloc 003D2538 (28 bytes) malloc'ed at line 104 of 'main.c' not freed
    SYSALLOC Bloc 003D2560 (28 bytes) malloc'ed at line 104 of 'main.c' not freed
    SYSALLOC Bloc 003D2588 (28 bytes) malloc'ed at line 104 of 'main.c' not freed

  17. #17
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Oui je n'ai pas fait de free pour les malloc, c'est la première fois que je les utilise et j'ai découvert juste hier les free ! Je vais le corriger ...
    Je suis débutante en C ...

    j'ai testé le code que tu as posté (seul sans y rajouter quoi que ce soit) et j'obtient :
    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
    MyPc-> ~/Documents$ ./exo
    test = IL2_CANFA  IL2_FECA  IL2_HORSE 
    Mot de la phrase numero : 1 IL2_FECA
    Mot de la phrase numero : 2 IL2_HORSE
    -----------------------------------------
    IL2_CANFA
    IL2_FECA
    IL2_HORSE
    #?#?#?
     
    test=IL2_CANFA
    test=IL2_FECA
    test=IL2_HORSE
    test=#?#?#?
    test=
    Comment virée les caractères de fin de ligne ?

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    j'ai testé le code que tu as posté (seul sans y rajouter quoi que ce soit) et j'obtient :
    Avec quel fichier de données ("matrice.txt") ?

  19. #19
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Avec quel fichier de données ("matrice.txt") ?
    oui !
    Je pense que c'est les retours chariots d'ailleurs qui font beugé mon code ! Il y a un équivalent du chomp en C ... je m'y connais en perl mais très peu en C (et en perl ce ptit prog se code en 10min )

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kioka Voir le message
    oui !
    OK, mais si tu nous donnes pas ce fichier, on ne peut rien tester...

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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