Langage c: erreur dans mon code m'échappe

Bonjour,

Voilà, je suis depuis hier sur ce bout de code. Il se plante. Je n'arrive pas à corriger le problème.
Le debuggeur me renvoie une erreur dans la formule du calcul de distance dans la focntion afficher_distance!!
Pourriez-vous m'aider?
Merci par avance.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct noeud noeud;
struct noeud{
   double abscisse;
   double ordonee;
     struct noeud *suivant;
};
typedef noeud* llist;


llist ajouter_noeud(llist client_liste, int id, double abs,double ord,int dde,int tps_service,int b_inf_tw,int b_sup_tw,int cap)
{
   noeud* nouveau = (noeud*) malloc(sizeof(noeud));
      nouveau->abscisse = abs;
   nouveau->ordonee = ord;
      nouveau->suivant = client_liste;

   return nouveau;
}
void afficher_distance (llist client_liste)
{

   noeud *h = client_liste;
   noeud *p1 = client_liste;
   noeud *p2 = client_liste;
   noeud *debut_liste = client_liste;


   int i;
   int j;
   double **distance;
   FILE * fichier;
	fichier = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");

	if(fichier == NULL)
	{
		printf("Impossible d'ouvrir fichier .txt \n");
		exit (-1);
	}
	for(i=0;i<7;i++)
		fscanf(fichier, "%lf %lf ",&(h->abscisse),&(h->ordonee));

   distance = (double ** ) malloc (7 * sizeof (double));
	for (i=0;i<7;i++)
	{

		distance[i]=(double *) malloc (7 * sizeof(double));
	}
   i=0;
   j=0;
   for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
         {
            for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
            {
               if(i == j)
               {
                  distance[i][j]= 0.0;
               }
               else
               {
                  distance[i][j]=distance[j][i]=sqrt((p1->abscisse * p2->abscisse) + (p1->abscisse * p2->abscisse) -(p1->ordonee * p2->ordonee) + (p1->ordonee * p2->ordonee));

               }
               j++;
            }
            i++;

         }



   /*affichage sur l'écran de la matrice distance */
    for (i=0;i<7;i++)
	 {
		for (j=0;j<7;j++)
		{
		   printf("\n distance[%i][%i]=%.1lf\n",i, j, distance[i][j]);
      }
	 }


   


   for(i=0;i<7;i++)free(distance[i]);
   free(distance);
   fclose (fichier);
}


void afficher_liste(llist client_liste)
{
   noeud *p = client_liste;
   printf("contenu de la liste\n");
   while(p!= NULL)
   {
      printf("%lf %lf ",p->abscisse,p->ordonee);
      p = p->suivant;
   }
}
int main (void)
{
   llist ma_liste = NULL;
   double abs;
   double ord;
      int i;
   FILE *fp;


   if(ma_liste!= NULL)
      printf("la liste est non vide \n");
   fp = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
	if(fp == NULL)
	{
		printf("Impossible d'ouvrir fichier donnees .txt \n");
		exit (-1);
	}

   for(i=0;i<7;i++){
      fscanf(fp,"%lf %lf ",&abs,&ord);
   ma_liste = ajouter_noeud(ma_liste,abs,ord);

   }



   afficher_distance(ma_liste);

   fclose (fp);



   getchar();
   return EXIT_SUCCESS;

}

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Dans le main : la fonction ajouter_noeud ne prend pas 3 arguments mais 9 !!!
    Sinon il n'y a pas de problème à la compilation pour afficher_distance...
    1. Au fait, j'ai essayé de mettre le truc qui me pose problème. J'ai raté de modifier la fonction ajouter_noeud.
      Sinon, le compilateur me renvoie une erreur sur cette ligne
       sqrt((p1->abscisse * p2->abscisse) + (p1->abscisse * p2->abscisse) -(p1->ordonee * p2->ordonee) + (p1->ordonee * p2->ordonee));
      
      

      Quand je réecris de cette façon , ça plante également.
      Merci de vos lumières.
      void afficher_distance (llist client_liste)
      {
      
         noeud *h = client_liste;
         noeud *p1 = client_liste;
         noeud *p2 = client_liste;
         noeud *debut_liste = client_liste;
         int i;
         int j;
         double c = p1->abscisse - p2->abscisse;
         double d = p1->ordonee -  p2->ordonee;
         double **distance;
         FILE * fichier;
      	fichier = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
      
      	if(fichier == NULL)
      	{
      		printf("Impossible d'ouvrir fichier .txt \n");
      		exit (-1);
      	}
      	for(i=0;i<7;i++)
      		fscanf(fichier, " %lf %lf", &(h->abscisse),&(h->ordonee);
      
         distance = (double ** ) malloc (7 * sizeof (double));
      	for (i=0;i<7;i++)
      	{
      
      		distance[i]=(double *) malloc (7 * sizeof(double));
      	}
         i=0;
         j=0;
         for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
         {
            for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
            {
               if(i == j)
               {
                        distance[i][j]= 0.0;
               }
               else
               {
                        distance[i][j]= distance[j][i]= sqrt(c *  c +  d * d);
      
               }
               j++;
            }
            i++;
      
         }
         /*affichage sur l'écran de la matrice distance */
          for (i=0;i<7;i++)
      	 {
      		for (j=0;j<7;j++)
      		{
      		   printf("\n distance[%i][%i]=%.1lf\n",i, j, distance[i][j]);
          
                    }
      }
      }
      
      1. Modérateur
        L'idéal serait d'avoir à chaque fois le code complet, et la sortie de ton compilateur c'est à dire l'intitulé exact de l'erreur. Et encore mieux nous expliquer ce qu'est censé faire ton programme...
      2. Bonjour,

        En fait, mon programme permet de créer une liste chainée simple qui contient deux élements: abscisse et coordonées ensuite de calculer la distance entre tous les noeuds et la mémoriser dans une matrice. Afficher cette matrice à la fin.
        Vous trouverez ci-dessous mon code complet. J'utilise CodeBlocks (gcc). Il m'affiche erreur sur la ligne ci-après dans la fonction afficher_distance. Il ne m'indique pas l'intitulé de l'erreur :(((
        Merci de vos lumières.
        #include<stdio.h>
        #include<stdlib.h>
        #include<math.h>
        typedef struct noeud noeud;
        struct noeud{
           double abscisse;
           double ordonee;
           struct noeud *suivant;
        };
        typedef noeud* llist;
        llist ajouter_noeud(llist client_liste, double abs,double ord)
        {
           noeud* nouveau = (noeud*) malloc(sizeof(noeud));
           nouveau->abscisse = abs;
           nouveau->ordonee = ord;
           nouveau->suivant = client_liste;
           return nouveau;
        }
        void afficher_distance (llist client_liste)
        {
        
           noeud *h = client_liste;
           noeud *p1 = client_liste;
           noeud *p2 = client_liste;
           noeud *debut_liste = client_liste;
           int i;
          int j;
          double c = p1->abscisse - p2->abscisse;
          double d = p1->ordonee -  p2->ordonee;
          double **distance;
          FILE * fichier;
        	fichier = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
        
        	if(fichier == NULL)
        	{
        		printf("Impossible d'ouvrir fichier .txt \n");
        		exit (-1);
        	}
        	for(i=0;i<7;i++)
        		fscanf(fichier, " %lf %lf ",&(h->abscisse),&(h->ordonee));
        
           distance = (double ** ) malloc (7 * sizeof (double));
        	for (i=0;i<7;i++)
        	{
        
        		distance[i]=(double *) malloc (7 * sizeof(double));
        	}
           i=0;
           j=0;
           for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
        
           {
              for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
              {
                 if(i==j)
                 {
                          distance[i][j]= 0.0;
                 }
                 else
                 {
                    distance[i][j]= distance[i][j]= sqrt(c *  c +  d * d);
        
                 }
                 i++;
              }
              j++;
        
           }
           /*affichage sur l'écran de la matrice distance */
            for (i=0;i<7;i++)
        	 {
        		for (j=0;j<7;j++)
        		{
        		   printf("\n distance[%i][%i]=%.1lf\n",i, j, distance[i][j]);
              }
        	 }
            for(i=0;i<7;i++)free(distance[i]);
            free(distance);
              fclose (fichier);
        }
        
        
        void afficher_liste(llist client_liste)
        {
           noeud *p = client_liste;
           printf("contenu de la liste\n");
           while(p!= NULL)
           {
              printf(" %lf %lf \n",p->abscisse,p->ordonee);
              p = p->suivant;
           }
        }
        int main (void)
        {
           llist ma_liste = NULL;
           double abs;
           double ord;
           int i;
           FILE *fp;
           if(ma_liste!= NULL)
              printf("la liste est non vide \n");
           fp = fopen("D:\\Codes \\TS2004t3\\test.txt", "r");
        	if(fp == NULL)
        	{
        		printf("Impossible d'ouvrir fichier donnees .txt \n");
        		exit (-1);
        	}
        
           for(i=0;i<7;i++){
              fscanf(fp," %lf %lf \n",&abs,&ord);
              ma_liste = ajouter_noeud(ma_liste,abs,ord);
        
           }
           afficher_distance(ma_liste);
           fclose (fp);
           getchar();
           return EXIT_SUCCESS;
        
        }
        
      3. Quelqu'un pourrait-il m'aider?
      4. Modérateur
        Chez moi ce code compile, et chez toi il n'y a pas de message d'erreur explicite !
        Comment t'aider à trouver une erreur fantôme ?
        Essaye avec qqch d'autre que Code::Blocks, par exemple Dev-C++