Langage c: erreur dans mon code m'échappe

Fermé
sportif_C Messages postés 18 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 16 janvier 2012 - 7 avril 2011 à 08:48
sportif_C Messages postés 18 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 16 janvier 2012 - 7 avril 2011 à 21:45
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;

}

A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 avril 2011 à 11:49
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
sportif_C Messages postés 18 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 16 janvier 2012
7 avril 2011 à 12:19
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
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 avril 2011 à 13:25
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
sportif_C Messages postés 18 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 16 janvier 2012
7 avril 2011 à 15:39
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
sportif_C Messages postés 18 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 16 janvier 2012
7 avril 2011 à 20:21
Quelqu'un pourrait-il m'aider?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 avril 2011 à 21:26
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
sportif_C Messages postés 18 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 16 janvier 2012
7 avril 2011 à 21:45
Il compile mais il me renvoie des valeurs bizarres de la matrice distance. Voici une capture écran
https://www.imagup.com/data-recovery-solutions-for-small-businesses-of-san-francisco/
:(
0