Le plus proche...

Résolu
Sniper_binaire Messages postés 7 Date d'inscription dimanche 16 septembre 2007 Statut Membre Dernière intervention 20 mai 2009 - 31 déc. 2008 à 09:36
Sniper_binaire Messages postés 7 Date d'inscription dimanche 16 septembre 2007 Statut Membre Dernière intervention 20 mai 2009 - 1 janv. 2009 à 16:43
Bonjours !
Voila je viens avec un petit problème qui me cause des gros soucis : Un bug !
Voila ce que ce code est censé faire : il prend nos coordonnés (x,y) et un nombre n de points (Xi,Yi)
il doit retourner le point le pus proche....
Le code marche !
mais lorsque je l'exécute dans un programme de test automatique (avec une centaine  de valeurs aléatoires) il me fait une erreure fattale....

en espérent pourvoir résoudre ce léger probleme, je vous joint le code (la, maintenant, tout de suite)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int gps(int x, int y, int n, int** centres)
{
    int* dist;
    int curseur = n;
    int min = n;
    dist = calloc(n,sizeof(int));
    for(int _l = 0; _l < n; ++_l)
        dist[_l] = (int)sqrt((x-centres[_l][0])*(x-centres[_l][0])+(y-centres[_l][1])*(y-centres[_l][1]));
    for(int _l = 0; _l < n; ++_l,--curseur)
    {
        if(dist[curseur]<=dist[min]) min = curseur;
    }
    return min;
}

int main(void)
{
  int x;
  int y;
  int n;
  int g;
  int** centres;

  scanf("%d", &x);

  scanf("%d", &y);

  scanf("%d", &n);

centres = calloc(n, sizeof(int*));
  for(int _l = 0; _l < n; ++_l)
    centres[_l] = calloc(2, sizeof(int));
  for(int _l = 0; _l < n; ++_l)
    for(int _c = 0; _c < 2; ++_c)
      scanf("%d", &centres[_l][_c]);

g = gps(x, y, n, centres);
printf("%d %d",centres[g][0],centres[g][1]);
  return 0;
}

Moi j'ai toujours rigolé, mais juste pour rire...

9 réponses

cs_goodboy21 Messages postés 29 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 11 avril 2010
31 déc. 2008 à 16:05
salut ton erreur venait du fait que : curseur=n et min =n etaient hors-limite
voici ton code légèrement remanié.

int gps(int x, int y, int n, int** centres)
{
    float* dist;
    int curseur = n-1;
    int min = n-1;
    int _l;
    dist = (float*)calloc(n,sizeof(float));
    for(_l = 0; _l < n; _l++)
        dist[_l] = (int)sqrt((x-centres[_l][0])*(x-centres[_l][0])+(y-centres[_l][1])*(y-centres[_l][1]));
    for( _l = 0; _l < n; _l++)
       
    {
        if(dist[curseur]<=dist[min]) min = curseur;
        curseur--;
    }
    free(dist);
    return min;
}

int main(void)
{

  int x;
  int y;
  int n;
  int g;
  int _l;
  int** centres;

  scanf("%d", &x);

  scanf("%d", &y);

  scanf("%d", &n);

centres = (int**)calloc(n, sizeof(int*));
  for( _l = 0; _l < n; _l++)
    centres[_l] = (int*)calloc(2, sizeof(int));
  for( _l = 0; _l < n; _l++)
    for(int _c = 0; _c < 2; _c++)
      scanf("%d", &centres[_l][_c]);

g = gps(x, y, n, centres);
printf("%d %d",centres[g][0],centres[g][1]);

for(_l=0;_l<n;_l++)
 free(centres[_l]);

free(centres);
    return 0;
   
}
3
cs_goodboy21 Messages postés 29 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 11 avril 2010
31 déc. 2008 à 16:10
j'ai oublié.
il faut remplacer
dist[_l] = (int)sqrt((x-centres[_l][0])*(x-centres[_l][0])+(y-centres[_l][1])*(y-centres[_l][1]));
par : dist[_l] = sqrt((x-centres[_l][0])*(x-centres[_l][0])+(y-centres[_l][1])*(y-centres[_l][1]));
3
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
31 déc. 2008 à 09:44
Salut,
Je n'ai pas de quoi tester ton programme mais pour commencer tu peux ajouter la libération de la mémoire allouée.
En effet tu utilises des calloc mais tu ne fais jamais de free(..), donc tu généres des fuites mémoires.

Shell
0
Sniper_binaire Messages postés 7 Date d'inscription dimanche 16 septembre 2007 Statut Membre Dernière intervention 20 mai 2009
31 déc. 2008 à 10:09
Mercis, je l'ai mis maintenant , mais il n'est toujours pas content : toujours cette erreur fatale....

Moi j'ai toujours rigolé, mais juste pour rire...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
31 déc. 2008 à 10:21
Peux-tu nous donner l'erreur que tu as ?
As tu essayer de passer en debug dans ton code et de voir ou le plantage ce produit ?

Shell
0
Sniper_binaire Messages postés 7 Date d'inscription dimanche 16 septembre 2007 Statut Membre Dernière intervention 20 mai 2009
31 déc. 2008 à 10:56
ben justement, je ne peut pas !
erreur windows, envoyer le rapport d'erruere, et tout sa...
Et pour le debug, je ne peut pas non plus car je teste ce code plusieurs centaines de fois de manière automatique...
sa doit bugger qu'avec certaines valeurs (n, ou je ne sait trop quoi...)

Moi j'ai toujours rigolé, mais juste pour rire...
0
Sniper_binaire Messages postés 7 Date d'inscription dimanche 16 septembre 2007 Statut Membre Dernière intervention 20 mai 2009
1 janv. 2009 à 13:06
Ok, mercis, sa marche avec tes modifs, mais pour être franc, je ne comprend pas ce hors limite ....
je ne dépasse pas la portée d'un int pourtant....
0
cs_goodboy21 Messages postés 29 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 11 avril 2010
1 janv. 2009 à 13:15
c'est simple , si ton tableau est de taille n, par exemple n=3, les indices de ton tableau son 0,1,2.
l'indice 3 est hors-limite, ds ta fonction 'gps' tu avais curseur=n dc 3 et min=n dc 3 aussi, et lorsque
tu faisais dist[min] ça plantait, car dist[3] .
0
Sniper_binaire Messages postés 7 Date d'inscription dimanche 16 septembre 2007 Statut Membre Dernière intervention 20 mai 2009
1 janv. 2009 à 16:43
OK !!!

Mercis, j'avais oublié que les index commencaient a 0...

mercis bien !
0
Rejoignez-nous