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 :

les fonctions, tout un problème


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Par défaut les fonctions, tout un problème
    Bonsoir,
    Dans le cadre d'un cours d'informatique un collègue et moi on doit créer un programme capable de contrôler deux moteurs pas à pas de tel sorte à que ceux-ci dessinent un carré.
    Rassurez-vous, je ne vais pas vous demander de le faire à ma place (je ne pense pas que vous le feriez de toute façon). Cependant, comme nous sommes débutant dans le
    domaine de la programmation et plus encore en C, votre aide serait la bienvenue.
    Donc voici notre soucis:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    #include <stdio.h>
    #include <math.h>
    //je déclare deux tableaux que je vais remplir par la suite.
    float coordinatesX [80];
    float coordinatesY [80];
    int main(int argc, char *argv[]){
     
     
        int i,x,y,z;
     
        for(i=0;i<20;i++){
      coordinatesX [i]= 50;
      } // Rempli le tableau coordinateX avec pour les 20 premiers elements la valeur 50 et le reste indefini
        for(x=20;x<40;x++){
      coordinatesX [x]= 50+(x-19);
      }// Le meme tableau de 20 a 29 avec des valeurs de 51 a 71
        for(y=40;y<60;y++){
      coordinatesX [y]= 70;
        } // de 50 a 60 avec la valeur 70
        for(z=60;z<80;z++){
      coordinatesX [z]= 70 -(z-59);
      }// de 60 a 80 avec les valeurs 71 a 49
     
    //Je remplis également le tableaux des coordonnées Y à l'aide de boucle "for" mais avec de valeurs différentes
        for(i=0;i<20;i++){
      coordinatesY [i] = 5-i;
        }
        for(x=20;x<40;x++){
      coordinatesY [x] = -15;
        }
        for(y=40;y<60;y++){
      coordinatesY [y] = -15+(y-40);
        }
        for(z=60;z<80;z++){
      coordinatesY [z] = 5;
        }
    vecteurAP(coordinatesY);// j'envoie le tab. de coordonnées Y au vecteur AP
    vecteurBP(coordinatesY);//j'envoie le tab. de coordonnées Y au vecteur BP
    normeAP(coordinatesX);//J'envoie le tab. de coordonnées X à la fct. norme pour calculer la norme AP
    normeBP(coordinatesX);//J'envoie le tab. de coordonnées X à la fct. norme pour calculer la norme BP
    }//je désir que les tableaux que j'envoie restent tel que je l'ai remplis indépendemment des calculs que je fais avec à posteriori.
    void vecteurAP(float coordinatesY[]);//je déclare ma vonction AP
    void vecteurBP(float coordinatesY[]);//Je déclare ma fonction vecteur BP
    // Cette fonction prend un tableau a une dimension (un vecteur) de coordonnees et rempli
    // Le tableau coordinates YAP avec les elements de ce vecteur auxquels on a soustrait 35.
    void vecteurAP (float coordinatesY[]){
    float coordinatesYAP [80];//je déclare un nouveau tab. que je vais remplir à l'aide de celui que j'ai remplis précedemment c-à-d coordonnées Y
      float l = 70;
      int i;
      for(i=0;i<80;i++){
        coordinatesYAP [i] = coordinatesY [i]-(l/2);
      }
    normeAP(coordinatesYAP);//une fois mon vecteurYAP remplis à l'aide des coordonnées Y je l'envoie à la fct. norme AP
    }//de même que pour la fct vecteur AP mais cette fois ci pour le vecteur BP
    void vecteurBP (float coordinatesY[]){
    float coordinatesYBP [80];
      float l = 70;
      int i;
      for(i=0;i<80;i++){
        coordinatesYBP [i] = coordinatesY [i]+(l/2);
      }
    normeBP(coordinatesYBP);//une fois mon vecteurYAP remplis à l'aide des coordonnées Y je l'envoie à la fct. norme AP
    }
    void normeAP(float coordinatesYAP[],float coordinatesX[]);//je déclare mes fcts. normes
    void normeBP(float coordinatesYBP[],float coordinatesX[]);
     
     
    //je les remplis à l'aide des coordonnées X et du vecteur YAP, que j'ai remplis avant, la norme AP
     
    void normeAP (float coordinatesYAP[], float coordinatesX[]){
    float normeAP [80];//déclaration du tableau normeAp
    int a;
        for(a=0;a<80;a++){
        normeAP[a] = coordinatesX[a]*coordinatesX[a] + coordinatesYAP[a]*coordinatesYAP[a];
        }
        for(a=0;a<80;a++){
        normeAP[a]= sqrtf(normeAP[a]);
        }
       // angleAlpha1(normeAP);
        angleAlpha2(normeAP);//j'envoi la norme que j'ai calculé à l'angle alpha 2
       // angleBeta1(normeAP);
        angleBeta2(normeAP);//j'envoi la mème  norme que j'ai calculé à l'angle beta 2
    }
    void normeBP (float coordinatesYBP[], float coordinatesX[]){//même chose que pour la norme AP mais avec les coordonnées YBP et X pour la calculer
    float normeBP [80];//déclaration du tab.norme BP
    int a;
        for(a=0;a<80;a++){
        normeBP[a] = coordinatesX[a]*coordinatesX[a] + coordinatesYBP[a]*coordinatesYBP[a];
        }
        for(a=0;a<80;a++){
        normeBP[a]= sqrtf(normeBP[a]);
        }
       // angleAlpha1(normeBP);
        angleAlpha2(normeBP);//j'envoi la norme que j'ai calculé à l'angle alpha 2
      //  angleBeta1(normeBP);
        angleBeta2(normeBP);
     
    }
    //void angleAlpha1(float normeAP[], float normeBP []);
     
    void angleAlpha2(float normeAP[], float normeBP []);//Je déclare mes fcts. d'angles
     
    //void angleBeta1(float normeAP[], float normeBP[]);
     
    void angleBeta2(float normeAP[], float normeBP[]);
    //et j'utilise les tableaux que j'ai remplis avant pour remplir un autre tab. avec les angles
     
    void angleAlpha2 (float normeAP[], float normeBP[]){
    float angleAlpha2[80];
    float l = 70;
    int a;
        for(a=0;a<80;a++){
        angleAlpha2[a]= (powf(l,2) + powf(normeAP[a],2) - powf(normeBP[a],2)) /
                                    (2 * l * normeAP[a]);
        }
    }
     
     
    void angleBeta2 (float normeAP[], float normeBP[]){
    float angleBeta2[80];
    float l = 70;
    int a;
        for(a=0;a<80;a++){
        angleBeta2[a]= (powf(l,2) + powf(normeBP[a],2) - powf(normeAP[a],2)) /
                                    (2 * l * normeBP[a]);
        }
        impression(angleBeta2);//j'envoie mon tab. d'angles à la fct imprimer
    }
    //comme étape intermédiaire je décide d'imprimer les supposés angles grace à cette fct...mais ça ne marche pas.
    void impression(float angleBeta2[]);
     
    void impression(float angleBeta2[]){
    int a;
        for(a=0;a<80;a++){
            printf("%f\n", angleBeta2[a]);
        }
    }

    Donc voilà, on n'a pas de problèmes pour compiler mais par contre on a une bonne quantité de "warnings". La fonction imprimer n'est là que pour contrôler le résultat des opp. math. une fois qu'elles seront correctes on l'effacera.
    On se doute qu'on n'a pas su appeler, déclarer ou définir les fonctions (ou les trois).

    voici la liste de warnings:warning: conflicting types for 'vecteurAP' [enabled by default]|
    |37|note: previous implicit declaration of 'vecteurAP' was here|
    c'est tout le temps la même chose mais avec toute le déclaration...

    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 466
    Par défaut
    Bonjour,

    Citation Envoyé par DanFire Voir le message
    voici la liste de warnings:warning: conflicting types for 'vecteurAP' [enabled by default]|
    |37|note: previous implicit declaration of 'vecteurAP' was here|
    c'est tout le temps la même chose mais avec toute le déclaration...
    Le message signifie exactement « Conflit de types pour « vecteurAP() ». Note : la déclaration implicite et antérieure de vecteurAP() se trouvait ICI. ».

    C'est dû à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    vecteurAP(coordinatesY);// j'envoie le tab. de coordonnées Y au vecteur AP
    vecteurBP(coordinatesY);//j'envoie le tab. de coordonnées Y au vecteur BP
    normeAP(coordinatesX);//J'envoie le tab. de coordonnées X à la fct. norme pour calculer la norme AP
    normeBP(coordinatesX);//J'envoie le tab. de coordonnées X à la fct. norme pour calculer la norme BP
    }//je désir que les tableaux que j'envoie restent tel que je l'ai remplis indépendemment des calculs que je fais avec à posteriori.
    void vecteurAP(float coordinatesY[]);//je déclare ma vonction AP
    void vecteurBP(float coordinatesY[]);//Je déclare ma fonction vecteur BP
    // Cette fonction prend un tableau a une dimension (un vecteur) de coordonnees et rempli
    // Le tableau coordinates YAP avec les elements de ce vecteur auxquels on a soustrait 35.
    void vecteurAP (float coordinatesY[]){
    Autrement dit, dans l'ordre, tu :
    1. Appelle ta fonction, puis
    2. Déclare ta fonction, puis
    3. Définis ta fonction.


    Comme tu appelles ta fonction avant même d'avoir informé le compilateur de son existence, celui-ci fait l'hypothèse que son type (donc celui de sa valeur de retour) est du même modèle que la fonction main et qu'elle renvoie donc un int. Et il va construire tout son code sur cette hypothèse. Comme tu la redéclares juste après avec un autre type (void), le compilateur t'indique que cela entre conflit avec ce qu'il a supposé jusqu'ici.

    En réalité, les prototypes de fonction servent justement à établir d'emblée l'interface d'appel d'une fonction avant de la définir entièrement, justement pour que le code qui se trouve avant puisse y faire référence quand même. C'est pratique notamment lorsque deux fonctions s'appellent mutuellement, ou lorsque ces fonctions se trouvent dans une bibliothèque tierce, déjà compilée ou qui le sera ultérieurement.

    Moralité, il faut déplacer les deux prototypes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void vecteurAP(float coordinatesY[]);//je déclare ma vonction AP
    void vecteurBP(float coordinatesY[]);//Je déclare ma fonction vecteur BP
    … en tête de programme, après tes includes et avant tes tableaux de coordonnées.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    on n'a pas de problèmes pour compiler mais par contre on a une bonne quantité de "warnings".
    Tu fais un truc, un mec crie "attention ! attention !" et tu te dis qu'il n'y a pas de problème ? Vraiment ?

    Il ne faut jamais ignorer les warnings du compilateur. En C, ils indiquent très souvent un bug potentiel et cela implique de corriger ton code. Certains warnings sont du "bruit", mais ils sont un minorité et peuvent de toute façon être corrigés eux aussi.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Par défaut
    merci beaucoup, ça m'a vraiment aidé et même si maintenant je n'ai plus de warnings une multitudes d'erreurs sont apparues. Je vous remercie encore car on commençais à désespérer (notre prof est un incompétent).
    Et Bktero, on se doutait bien que ça n'allait pas fonctionner mais sans solution possible que faire si ce n'est les ignorer: oops:

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par DanFire Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //je déclare deux tableaux que je vais remplir par la suite.
    float coordinatesX [80];
    float coordinatesY [80];
    Bonjour

    En programmation "structurée", tu as un outil incomparable pour lier entre eux plusieurs éléments disparates: la "structure". Ca te permet de "grouper" dans une même entité logique plusieurs éléments qui sont liés dans la vraie vie. On a par exemple le prix et le poids dans les marchés de légume, le jour, le mois et l'année dans une date, les heures, minutes et secondes dans une heure et ici une abscisse en X et une ordonnée en Y.

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct {
        float x;
        float y;
    } t_coord;
     
    // Je déclare mon tableau que je vais remplir par la suite.
    t_coord coord[80];

    La différence dans le code, c'est qu'au lieu d'écrire coordX[i]=valeurX et coordY[i]=valeurY, tu écris coord[i].x=valeurX et coord[i].y=valeurY. C'est à peine plus compliqué à comprendre et à utiliser mais ça t'apporte d'énormes avantages: en effet, suffit de passer une coordonnée à une fonction pour qu'elle puisse accéder aux deux éléments qui la composent => ça réduit le nombre de paramètres. Bon ici je ne comprends pas trop car il semble que les deux tableaux ne vont pas trop ensembles mais je pense qu'à un moment ou à un autre de ton code ils se rejoindront et là ça pourra avoir son utilité.

    Accessoirement si tu pouvais éviter de mettre tes tableaux en global ce serait un plus (surtout que tu les passes à tes fonctions)...

    Citation Envoyé par DanFire Voir le message
    notre prof est un incompétent
    Ca peut arriver. Mal payés, mal formés, mal employés... Ici la différence c'est qu'on n'est à la base pas des profs (quoique certains l'ont été) mais des passionnés (et un petit peu pros). On n'a pas le diplôme de l'enseignement mais on sait ce que c'est que d'apprendre et travailler ce langage...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/05/2005, 10h58
  2. Réponses: 3
    Dernier message: 08/08/2004, 21h35
  3. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  4. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  5. Réponses: 7
    Dernier message: 24/05/2003, 15h56

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