IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

un phenomene incomprehensible dans un code qui parait si simple


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Par défaut un phenomene incomprehensible dans un code qui parait si simple
    voila le bou de code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            int i;
    	float t=0.0;
    	float** result;
    	result = (float**)malloc(sizeof(float*) * (51) );
     
     
     
    	for (i=0 ; i<51 ; i++) {
    		*(result + i) = (float*)malloc(sizeof(float) * 3);
    		t = (float)(i/50.0);
    		*(result + i) = bezierBasisFunc( t, n, Points);
    		printf("\n result (%d) = %f %f %f \n\n", i, result[i][0], result[i][1], result[i][2]);
    	}
     
    	printf("\n result (0) = %f %f %f \n\n", result[0][0], result[0][1], result[0][2]);
    j explike un peu : ma fonction bezieBasisFunc est une fonction mathematique qui calcule les coordonnees des points d une courbe (elle fait une interpolation) en fonction d un parametre "t" et de l'ordre de l'interpolation "n" et des points qu'on lui donne (dans la matrice "Points"). en bref peu importe le calcul qui est effectue ici, j'aimerai que vous regardiez les affichage que je fait : j affiche deux fois les valeurs contenues dans le tableau a deux dimension "result" une fois dans la boucle ou les valeurs son calculees et une autre fois a l'exterieur de celle-ci juste apres ...

    or les valeur affichee sont differentes ! je n'arrive pas a comprendre pourquoi ... les coordonee contenu dans "result" et afichees dans la boucle sont bonnes ( une belle interpolation, bref ce que je veu ^_^ ) mai des que je sort de la boucle toute les valeurs dans "result" sont nulle ( oui toute, j'ai bien tout verifier pour essayer de comprendre ...)


    pourriez vous m'expliker cela ?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Il y a une anomalie dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (i=0 ; i<51 ; i++) {
      *(result + i) = (float*)malloc(sizeof(float) * 3);
    ...
      *(result + i) = bezierBasisFunc( t, n, Points);
    ...
     }
    Que renvoie donc bezierBasisFunc ? Un tableau de float qu'elle a créé dynamiquement ? Si c'est le cas, à quoi sert le malloc ?

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut

    euh.....

    Te rends-tu bien compte que :


    • d'une part tu alloues 3*51 places dans ta matrice (quelque chose comme mat[51][3] ?

    • je ne sais pas comment est ta fonction bezierBasisFunc, mais là tu dis que son résultat est un float contenu dans le premier élément du tableau dont l'indice est [i][0].....

    • qu'enfin tu utilises float, alors que le type naturel des nombres réels en C est double ?


    je te suggèrerais une écriture qui te simplifieras la vie, car plus claire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	for (i=0 ; i<51 ; i++) {
    		result[i] = (float*)malloc(sizeof(float) * 3);
    et si ta fonction doit retourner les 3 coefficients remplis, je te suggèrerais de le passer en paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bezierBasisFunc( t, result[i], n, Points);

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, peux-tu poster ta fonction bezierBasisFunc ? quel est son prototype ?

    Le code suivant ne compile pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    int main(void)
    {
    int i;
    	double t=0.0;
    	double** result=NULL;
    	result =malloc(sizeof(*result) * (51) );
    	if(result==NULL)
    	{
    	  fprintf("erreur\n");
    	  exit(1);
    	}
     
     
     
    	for (i=0 ; i<51 ; i++) {
    		result[i] = malloc(sizeof(*result[i]) * 3);
    		if(result[i]==NULL)
    		{
    		  fprintf("erreur\n");
    		  exit(1);
    		}
    		t = i/50.0;
    		result[i] = bezierBasisFunc( t, n, Points);
    		printf("\n result (%d) = %f %f %f \n\n", i, result[i][0], result[i][1], result[i][2]);
    	}
     
    	printf("\n result (0) = %f %f %f \n\n", result[0][0], result[0][1], result[0][2]);
      return 0;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Par défaut ok
    c etai ca le probleme merci bcp jai resolu mon souci en allouant la memoire dans la fonction qui calcul les coordonees ( ce qui etai en effet bcp plus logique ^^ )

    allouer la memoir comme je le faisai etait inutile et la memoir n'etait pas allouee correctement pour le tableau de float renvoyer par "bezierBasisFunc"

    merci bien diogene

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Par défaut dsl
    je n ai pas pu voir les autre repoinses apre diogene mai je tien a repondre quand meme


    Te rends-tu bien compte que :

    * d'une part tu alloues 3*51 places dans ta matrice (quelque chose comme mat[51][3] ?

    * je ne sais pas comment est ta fonction bezierBasisFunc, mais là tu dis que son résultat est un float contenu dans le premier élément du tableau dont l'indice est [i][0].....

    * qu'enfin tu utilises float, alors que le type naturel des nombres réels en C est double ?
    oui et meme si j alloue 12000*12000 places dans une matrice ou serait le probleme ? on a encore le droit d'utiliser la place qu'on veu non ?

    le retour de bezierBasisFunc est un pointeur vers le premier element d un tableau de 3 float oui tjr aucun souci je ne voi pas ou tu veu en venir

    j'utilise float oui personellement j aurai utiliser double aussi mais mes profs utilisent float ... je suis leur exemple a vrai dire ... mais cela a peut d importance, n'est-ce pas ?


    result[i] est exactement equivalent a *(result + i)
    result[i] est peut etre plus usuel mais *(result + i) a le merite d'etre plus parlant je trouve ... apres c'est encore un choix personnel qui a vraiment peu d'importance ...

    oui passer le tableau en parametre plutot que retourner un pointeur vers celui ci... pkoi pas ... encore une foi c est un choix ...

    sinon pour repondre a salseropom : biensur que non il se compile pas puisque vous n avez pas tout le code ... mai je ne voi pas dans kel but tu veu le compiler j ai poser une question simple a lakel diogene a repondu parfaitement en soulevant mon erreur ...


    dans tout les cas merci a vous d' avoir pris de votre temp pour moi

    a la prochaine!

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par guian Voir le message
    je n ai pas pu voir les autre repoinses apre diogene mai je tien a repondre quand meme




    oui et meme si j alloue 12000*12000 places dans une matrice ou serait le probleme ? on a encore le droit d'utiliser la place qu'on veu non ?

    le retour de bezierBasisFunc est un pointeur vers le premier element d un tableau de 3 float oui tjr aucun souci je ne voi pas ou tu veu en venir

    j'utilise float oui personellement j aurai utiliser double aussi mais mes profs utilisent float ... je suis leur exemple a vrai dire ... mais cela a peut d importance, n'est-ce pas ?


    result[i] est exactement equivalent a *(result + i)
    result[i] est peut etre plus usuel mais *(result + i) a le merite d'etre plus parlant je trouve ... apres c'est encore un choix personnel qui a vraiment peu d'importance ...

    oui passer le tableau en parametre plutot que retourner un pointeur vers celui ci... pkoi pas ... encore une foi c est un choix ...

    sinon pour repondre a salseropom : biensur que non il se compile pas puisque vous n avez pas tout le code ... mai je ne voi pas dans kel but tu veu le compiler j ai poser une question simple a lakel diogene a repondu parfaitement en soulevant mon erreur ...


    dans tout les cas merci a vous d' avoir pris de votre temp pour moi

    a la prochaine!
    Certes, *(result + i) est équivalent à result[i], mais pour ma part, je trouve que result[i] est plus parlant que la 1e méthode (mais ceci n'engage que moi bien entendu, tout est une question de choix

    je me doute bien que le code ne compilait pas étant donné que je n'avais pas tout le code... Ce que je voulais, était que tu postes ta fonction dont on avait pas le code pour pour voir d'où venait le bug.
    Que diogène ait trouvé la solution sans le code manquant, c'est très bien.
    Tu poses une question simple (je reprends tes termes), pour y réponde, j'aime bien avoir le code complet, c'est tout...

    Bien, ton problème est résolu, c'est l'essentiel.

  8. #8
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Certes, *(result + i) est équivalent à result[i], mais pour ma part, je trouve que result[i] est plus parlant que la 1e méthode (mais ceci n'engage que moi bien entendu, tout est une question de choix
    Et vous avez la version spécial masochiste qui fonctionne très bien, i[result]

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Pierre Maurette Voir le message
    Et vous avez la version spécial masochiste qui fonctionne très bien, i[result]
    gros mâlin ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Erreur de compilation dans un code qui pourtant fonctionne
    Par cslbcg dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/11/2009, 23h11
  2. un probléme dans un code qui m'a géné
    Par jack_1981 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/01/2008, 17h53
  3. [DOM] java.lang.ClassCastException dans un code qui modifie un fichier XML
    Par RouRa22 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 21/12/2007, 16h21
  4. Réponses: 24
    Dernier message: 13/12/2006, 13h54
  5. [SQL] Problème de requete qui parait pourtant simple
    Par sephirothmana dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/06/2006, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo