Langage c: erreur dans mon code m'échappe

sportif_C Messages postés 23 Statut Membre -  
sportif_C Messages postés 23 Statut Membre -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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...
    0
  2. sportif_C Messages postés 23 Statut Membre
     
    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]);
        
                  }
    }
    }
    
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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...
      0
    2. sportif_C Messages postés 23 Statut Membre
       
      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;
      
      }
      
      0
    3. sportif_C Messages postés 23 Statut Membre
       
      Quelqu'un pourrait-il m'aider?
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      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++
      0