begin process at 2012 05 29 13:37:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Le plus proche...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Le plus proche...

mercredi 31 décembre 2008 à 09:36:19 | Le plus proche...

Sniper_binaire

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...
mercredi 31 décembre 2008 à 09:44:34 | Re : Le plus proche...

DeAtHCrAsH

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
mercredi 31 décembre 2008 à 10:09:09 | Re : Le plus proche...

Sniper_binaire

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...
mercredi 31 décembre 2008 à 10:21:52 | Re : Le plus proche...

DeAtHCrAsH

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
mercredi 31 décembre 2008 à 10:56:18 | Re : Le plus proche...

Sniper_binaire

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...
mercredi 31 décembre 2008 à 16:05:35 | Re : Le plus proche...

goodboy21

Réponse acceptée !
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;
   
}
mercredi 31 décembre 2008 à 16:10:34 | Re : Le plus proche...

goodboy21

Réponse acceptée !
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]));
jeudi 1 janvier 2009 à 13:06:54 | Re : Le plus proche...

Sniper_binaire

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....


jeudi 1 janvier 2009 à 13:15:37 | Re : Le plus proche...

goodboy21

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] .
jeudi 1 janvier 2009 à 16:43:45 | Re : Le plus proche...

Sniper_binaire

OK !!!

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

mercis bien !




Cette discussion est classée dans : int, for, scanf, centres, dist


Répondre à ce message

Sujets en rapport avec ce message

probleme programme [ par maciass ] slt est ce que qlq un peut me dire pkoi le programme suivant ne marche pas: #include #include #define GRAPHSIZE 2048#define INFINITY GRAPHSIZE* remplir un StringGrid [ par proxi69 ] Bonjour,Je cherche à remplir un StringGrid avec un fichier Excel, ou un fichier texte, ou un fichier csv...Bref je cherche à remplir ce tableau depuis A l'aiiiiide!!!! [ par Dorn17 ] Salut j'essaie depuis un moment de créer un programme pouvant résoudre des systèmes du type Ax=b par la méthode de Gauss.Toutefois j'ai des résultats Problème en tête bitmap [ par piroman14 ] Slt tt le monde!Je rencontre un petit problème dans mon algorithme. En effet, je n'arrive pas à coder l'en-tête d'une image bitmap correctement. J'obt problème avec l'initialision d'un tableau [ par khen ] Bonjour,voila j'ai un petite problème avec l'initialisation de mon tableau , je vous explique le problèmeon a un tableau de 3 dimension appelé tab et encadre un texte en c/c++ [ par lil_adriano ] Slt tout le monde je debute en C/C++ je voudrai faire cadre  pour un mot mais j'y arrive pas.j'ai essayer de faire un mais on peu pas faire un mot cor Application électrique [ par FSpring ] Bonjour,Voici un listing d'un simple programme qui crée une matrice de potentiels électriques (de 100 à 0). Sur mon PC, ce listing m'affiche 39   erre algorithmique de fonction rec [ par fs_fck_sarko ] bonjour tout le monde, est ce que quelquun pourai maider pour le calul de complexite d'un programme qui resout les sudoku ? En fait je voudrais trouve Réaliser une piramyde d'étoile. [ par developvbdebut ] Bonjour tout le mondeJ'ai un soucis avec un algo.Je dois faire un prog qui affiche le nombre de lignes d'etoile selon l'entier entré.Exemple:on entre


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales