Appeler un tableau dans une fonction
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Appeler un tableau dans une fonction



  1. #1
    Galibble

    Appeler un tableau dans une fonction


    ------

    Bonsoir,
    je suis débutant dans le domaine de la programmation en C. En faisant un travail pour les cours j'ai rencontré le problème suivant:

    j'ai créé une fonction "database" dans laquelle je défini deux tableaux: coordinatesX et coordinatesY et je les rempli séparément. Après,
    dans la fonction suivante j'essaye d'appeler l'un des deux tableaux (dans ce cas le Y) pour faire des opérations mathématiques avec. cependant
    je n'y arrive pas car j'ai quelques soucis avec tout ce qui concerne appeler des fonctions...

    Merci d'avance pour celui ou celle qui m'aidera
    pd: je suis sous arduino ce qui explique l’absence du "main"

    Code:
    //création de deux tableaux:l'un contient les coordonnées x et l'autre les y.
    //l'éspacement entre chaque coordonnées est d'un milimètre pour qu'après les angles
    //soient réduit et ainsi pouvoir tracer les droites même si les moteurs s'altèrnent.
    
    void dataBase(){
      float coordinatesX [80];
      float coordinatesY [80];
      float coordinatesXY [80][80];
      int i,x,y,z;
      
      for(i=0;i<20;i++){
      coordinatesX [i]= 50;
      }
      for(x=20;x<40;x++){
      coordinatesX [x]= 50+(x-19);
      }
        for(y=40;y<60;y++){
      coordinatesX [y]= 70;
        }
        for(z=60;z<80;z++){
      coordinatesX [z]= 70 -(z-59);
      }
      i,x,y,z = 0;//je nes suis pas sûr que se soit nécessaire, mais dans le doute...
      
      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;
        }
        return coordinatesY [];
        
    //  int a,b;
    //  for(a=0;a<80;a++){
    //    for(b=0;b<80;b++){
    //  coordinatesXY [a][b]= coordinatesX [a], coordinatesY [b];
    //      }
    //   }
    }
    void vecteurAP (){
      float l = 70;
      int i;
      for(i=0;i<=79;i++){
    coordinatesY [i] = coordinatesY [i] -(l/2);
      }
    }

    -----
    Dernière modification par Galibble ; 27/02/2015 à 19h38.

  2. #2
    Jack
    Modérateur

    Re : Appeler un tableau dans une fonction

    Si c'est comme en C, toute variable déclarée dans une fonction a la durée de vie de la fonction, donc disparait à la fin de la fonction. Il faut donc que les tableaux existent avant l'appel de la fonction qui en a besoin. Pour éviter les variables globales, on passe les tableaux (enfin plutôt leur adresse) en paramètre de la fonction.

  3. #3
    Galibble

    Re : Appeler un tableau dans une fonction

    oui c'est du C appliqué à arduino (en réalité je ne sais pas quelles sont les différences mis à part le "main" qui se voit remplacé par "loop")
    donc oui merci j'ai changé cette grave erreur de déclaration mais en ce qui concerne l’appel je suis tout aussi perdu qu'avant. Maintenant ou moins le nombres d'erreurs à la compilation est nettement
    inférieur. Merci encore

  4. #4
    Jack
    Modérateur

    Re : Appeler un tableau dans une fonction

    Montre ton code, on pourra peut-être te faire avancer.

  5. A voir en vidéo sur Futura
  6. #5
    Galibble

    Re : Appeler un tableau dans une fonction

    Mon code est exactement le même. À différence de ce que vous m'avez dit. je le remet ou cas ou. Les "//" sont des commentaires. voici l'erreur qui apparaît l'ors de la compilation:
    base_de_donnees.ino: In function 'void vecteurAP(float*)':
    base_de_donnees:50: error: invalid types 'float*[float]' for array subscript

    Code:
    //création de deux tableaux:l'un contient les coordonnées x et l'autre les y.
    //l'éspacement entre chaque coordonnées est d'un milimètre pour qu'après les angles
    //soient réduit et ainsi pouvoir tracer les droites même si les moteurs s'altèrnent.
     float coordinatesX [80];
      float coordinatesY [80];
      float coordinatesXY [80][80];
    void dataBase(){
     
      int i,x,y,z;
      
      for(i=0;i<20;i++){
      coordinatesX [i]= 50;
      }
      for(x=20;x<40;x++){
      coordinatesX [x]= 50+(x-19);
      }
        for(y=40;y<60;y++){
      coordinatesX [y]= 70;
        }
        for(z=60;z<80;z++){
      coordinatesX [z]= 70 -(z-59);
      }
      i,x,y,z = 0;//je nes suis pas sûr que se soit nécessaire, mais dans le doute...
      
      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;
        }
        void vecteurAP(float CoordinatesY[]);
        
    //  int a,b;
    //  for(a=0;a<80;a++){
    //    for(b=0;b<80;b++){
    //  coordinatesXY [a][b]= coordinatesX [a], coordinatesY [b];
    //      }
    //   }
    }
    void vecteurAP (float coordinatesY[]){
      float l = 70;
      int i;
      for(i=0;i<80;i++){
    coordinatesY [i] = coordinatesY [i-(l/2)];
      }
    }

  7. #6
    Galibble

    Re : Appeler un tableau dans une fonction

    Bon bah merci beaucoup de votre aide Jack, mais finalement j'ai trouvé la dernière erreur. il se trouve que ma toute dernière instruction est simplement impossible. le "-(l/2)" se fait après les accolades "[]". Bonne soirée

  8. #7
    Chanur

    Re : Appeler un tableau dans une fonction

    Bonjour,

    Alors reviens poser la question quand tu te demanderas pourquoi la fonction vecteurAP n'est jamais lancée ...

    A très bientôt.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  9. #8
    Jack
    Modérateur

    Re : Appeler un tableau dans une fonction

    Citation Envoyé par Chanur Voir le message
    Bonjour,

    Alors reviens poser la question quand tu te demanderas pourquoi la fonction vecteurAP n'est jamais lancée ...

    A très bientôt.
    Visiblement le code n'est pas complet car il manque au moins la fonction loop().

  10. #9
    Galibble

    Re : Appeler un tableau dans une fonction

    Voici le code en entier mais ce n'était pas necéssaire car il n'y a aucune autre mention des tableaux sur lesquels je travail.
    chanur si tu vois une erreur c'est gentil de le dire au lieu de faire le "malin" si j'ose dire. Merci de ton aide Jack



    Code:
    #define MOTA 1
    #define MOTB 2
    #include <math.h>
    
    int cur_pos_mota = 0;
    int cur_pos_motb = 0;
    
    //création de deux tableaux:l'un contient les coordonnées x et l'autre les y.
    //l'éspacement entre chaque coordonnées est d'un milimètre pour qu'après les angles
    //soient réduit et ainsi pouvoir tracer les droites même si les moteurs s'altèrnent.
     float coordinatesX [80];
      float coordinatesY [80];
      float coordinatesXY [80][80];
      float coordinatesYAP [80];
    void dataBase(){
     
      int i,x,y,z;
      
      for(i=0;i<20;i++){
      coordinatesX [i]= 50;
      }
      for(x=20;x<40;x++){
      coordinatesX [x]= 50+(x-19);
      }
        for(y=40;y<60;y++){
      coordinatesX [y]= 70;
        }
        for(z=60;z<80;z++){
      coordinatesX [z]= 70 -(z-59);
      }
      i,x,y,z = 0;//je nes suis pas sûr que se soit nécessaire, mais dans le doute...
      
      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;
        } 
        void vecteurAP(float CoordinatesY[]);
        
    //  int a,b;
    //  for(a=0;a<80;a++){
    //    for(b=0;b<80;b++){
    //  coordinatesXY [a][b]= coordinatesX [a], coordinatesY [b];
    //      }
    //   }
    }
    void vecteurAP (float coordinatesY[]){
      float l = 70;
      int i;
      for(i=0;i<80;i++){
    coordinatesYAP [i] = coordinatesY [i]-(l/2);
      }
    }
     
    byte etat[6]= {0x0A,0x0B,0x01,0x05,0x04,0x0E};
    int execute;
    
    void moteur1(int degre) {
      int pas = abs(degre )* 3;
      if(degre >= 0) {
        avancerPas1(pas, true);
       } else {
        avancerPas1(pas, false);
      }
    }
    void moteur2(int degre) {
      int pas = abs(degre )* 3;
      if(degre >= 0) {
        avancerPas2(pas, true);
       } else {
        avancerPas2(pas, false);
      }
    }
    
    void avancerPas1(int pas, byte sens) {
      int c;
     
        for(c=0; c<pas;c++) {
          oneStepMot1(sens);
          delayMicroseconds(3000);    
      } 
    }
    void avancerPas2(int pas, byte sens) {
      int c;
        for(c=0; c<pas;c++) {
          oneStepMot2(sens);
          delayMicroseconds(3000);    
        
      } 
    }
    
    void oneStepMot1(byte sens) {
      static int pos=0;
      
      if (sens) {
        pos = pos + 1;
        if(pos > 5) pos=0;
      } else {
        pos = pos - 1;
        if(pos < 0) pos=5;
      }
      PORTC=etat[pos];
    }
    
    void oneStepMot2(byte sens) {
      static int pos=0;
      
      if (sens) {
        pos = pos + 1;
        if(pos > 5) pos=0;
      } else {
        pos = pos - 1;
        if(pos < 0) pos=5;
      }
      
    //  writeKi(etat[pos]<<4);
    //  return;
      PORTC &= (PORTC & 0xCF);
      PORTC |= ((etat[pos] ) <<4) & 0x30;
      
      PORTD &= PORTD & 0xF3;
      PORTD |= (etat[pos] & 0x0C);
    }
    
    int writeKi(byte kk) {
      PORTC = kk & 0x3F;
      PORTD &= (kk>>4) & ~0x0C;
      PORTD |= (kk>>4) & 0x0C;
    }
    
    void setup() { 
      execute = false;
      DDRC = 0b11111111 ; //direction
      DDRD |= 0b00001100;
      PORTC = 0 ; //moteur non excité
    }
    
    //int execute = false;
    void loop() { 
    
      if(!execute) {
        moteur1(-90);
        moteur2(90); 
        moteur1(90);
        moteur2(-91);
        execute = true;
      }else{
        delay(100);
      }
    }

  11. #10
    Jack
    Modérateur

    Re : Appeler un tableau dans une fonction

    Si je peux me permettre une remarque, la code pour gérer les 2 moteurs est strictement identique mis à part la variable statique pos qui devra être associée à chacun des moteurs. Pourquoi ne pas factoriser ce code et différentier les 2 moteurs à l'aide d'un paramètre lors de l'appel des fonctions ?

  12. #11
    Galibble

    Re : Appeler un tableau dans une fonction

    Citation Envoyé par Jack Voir le message
    Si je peux me permettre une remarque, la code pour gérer les 2 moteurs est strictement identique mis à part la variable statique pos qui devra être associée à chacun des moteurs. Pourquoi ne pas factoriser ce code et différentier les 2 moteurs à l'aide d'un paramètre lors de l'appel des fonctions ?
    Parce que je suis débutant est c'est la seule façon que j'ai pour me retrouver dans le code. Je suis sûr qu'il y a plein de choses qui peuvent être optimisées mais pour cette atelier c'est le résultat qui compte. bien plus que l'optimisation du code.
    Jack, tu sais à quoi il faisait référence Chanur? ça serait bête qu'il y ai des erreurs...

  13. #12
    Chanur

    Re : Appeler un tableau dans une fonction

    Je peux corriger tes erreurs.
    Ou bien tu peux apprendre à les corriger toi-même ...
    Je te signale qu'il y en a une pour que tu sois vigilant, mais le travail de debugging est la plus grande partie du développement. Ça s'apprend, et le seul moyen c'est de mettre les mains dans le cambouis.
    C'est pour ça que je n'ai pas été plus précis.
    Si j'ai "fait le malin", c'est parce que tu annonçait tranquillement j'ai trouvé la dernière erreur, c'est tout.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  14. #13
    Jack
    Modérateur

    Re : Appeler un tableau dans une fonction

    Citation Envoyé par Galibble Voir le message
    Jack, tu sais à quoi il faisait référence Chanur? ça serait bête qu'il y ai des erreurs...
    Oui, la fonction vectorAP n'est en effet jamais appelée.
    En passant, le prototype de cette fonction se trouve bizarrement situé dans ton code.
    J'ai du mal à suivre sa logique car l'indentation est assez aléatoire.

  15. #14
    Galibble

    Re : Appeler un tableau dans une fonction

    D'accord, pas de soucis Chanur. Alors dites-moi, s'il vous plait, si mon raisonnement est correcte:

    1) je déclare mon tableau: float coordinatesY [80];

    2) déclaration de la fonction vecteursAP qui nécessitera le tableau donc: void vecteursAP(float CoordinatesY[]);

    3) Dans le void database je remplis mon tableau.

    4) ceci fait j'utilise la fonction vecteursAP qui contient le même tableau que je viens de remplir pour faire des ops. mathé. : void vecteursAP (float coordinatesY[]){

  16. #15
    Jack
    Modérateur

    Re : Appeler un tableau dans une fonction

    Citation Envoyé par Galibble Voir le message
    4) ceci fait j'utilise la fonction vecteursAP qui contient le même tableau que je viens de remplir pour faire des ops. mathé. : void vecteursAP (float coordinatesY[]){
    Je ne vois toujours pas à quel endroit tu utilises (tu appelles donc) la fonction vecteursAP

  17. #16
    Galibble

    Re : Appeler un tableau dans une fonction

    donc il suffirait de changer " void vecteursAP (float coordinatesY[]){" par
    Code:
    " void vecteursAP (){
      float l = 70;
      int i;
      for(i=0;i<80;i++){
    coordinatesYAP [i] = coordinatesY [i]-(l/2);
      }"
    le code final serait:
    Code:
    float coordinatesX [80];
    float coordinatesY [80];
    // float coordinatesXY [80][80];
    float coordinatesYAP [80];
      
    void vecteursAP(float CoordinatesY[]);
    
    void dataBase(){
     
      int i,x,y,z;
      
      for(i=0;i<20;i++){
      coordinatesX [i]= 50;
      }
      for(x=20;x<40;x++){
      coordinatesX [x]= 50+(x-19);
      }
        for(y=40;y<60;y++){
      coordinatesX [y]= 70;
        }
        for(z=60;z<80;z++){
      coordinatesX [z]= 70 -(z-59);
      }
      i,x,y,z = 0;//je nes suis pas sûr que se soit nécessaire, mais dans le doute...
      
      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;
        } 
        
        
    //  int a,b;
    //  for(a=0;a<80;a++){
    //    for(b=0;b<80;b++){
    //  coordinatesXY [a][b]= coordinatesX [a], coordinatesY [b];
    //      }
    //   }
    }
    
    void vecteursAP (){
      float l = 70;
      int i;
      for(i=0;i<80;i++){
    coordinatesYAP [i] = coordinatesY [i]-(l/2);
      }
    }

  18. #17
    Jack
    Modérateur

    Re : Appeler un tableau dans une fonction

    Tu ne réponds pas à ma question précédente: je ne vois toujours pas où la fonction vecteursAP est appelée, ou alors tu ne maîtrises pas ce qu'est un appel de fonction. Je vais rappeler les différences entre déclarer, définir et appeler une fonction.
    Déclaration de
    vecteursAP:
    Code:
    void vecteursAP();

    Définition de
    vecteursAP:
    Code:
    void vecteursAP(){
      float l = 70;
      int i;
      for(i=0;i<80;i++){
         coordinatesYAP [i] = coordinatesY[i]-(l/2);
      }
    }
    Appel de vecteursAP:
    Code:
    vecteursAP();

    tu noteras que je n'ai pas mis de paramètre dans la fonction vu que tes tableaux sont globaux.

    Donc finalement, où se trouve la ligne
    Code:
    vecteursAP();
    ?
    Dernière modification par Jack ; 28/02/2015 à 13h21.

  19. #18
    Chanur

    Re : Appeler un tableau dans une fonction

    Citation Envoyé par Galibble Voir le message
    4) ceci fait j'utilise la fonction vecteursAP qui contient le même tableau que je viens de remplir pour faire des ops. mathé. : void vecteursAP (float coordinatesY[]){
    Non : là, c'est la ligne ou tu définis la fonction : tu dit ce qu'elle fera quand on la lancera.

    Mais j'ai la même question que Jack : où est-ce que tu l'utilises, que tu l'appelles, que tu la lances ? (les 3 veulent dire la même chose)
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

Discussions similaires

  1. langage c, entrer un tableau de structure dans une fonction
    Par invitecd37efaf dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 10/02/2013, 13h31
  2. Pic C Appeler une fonction dans une interruption
    Par invite976e6cb2 dans le forum Électronique
    Réponses: 8
    Dernier message: 02/12/2012, 11h01
  3. fonction enveloppe sous matlab (cherchons les max et les min dans un tableau)
    Par IHCAAMEL dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 27/05/2012, 20h48
  4. Faire appel à plusieurs tableau dans une même fonction
    Par krimo-30 dans le forum Électronique
    Réponses: 2
    Dernier message: 09/05/2011, 10h57
  5. comment appeler une fonction ecrite en C++ sur Matlab
    Par invite5c0c3007 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 17/06/2005, 14h35