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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é ....

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