[Programmation] error: invalid types 'double[int]' for array subscript -- Arduino
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

error: invalid types 'double[int]' for array subscript -- Arduino



  1. #1
    Slaivers

    Cool error: invalid types 'double[int]' for array subscript -- Arduino


    ------

    Bonjour,

    Je suis un débutant sur le langage Arduino, et je veux réaliser un programme qui permet de calculer la fréquence d'un signal (à part la fonction PulseIn qui existe déjà dans la syntaxe). Mon programme est le suivant:

    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(11,10,5,4,3,2);
    boolean Tr[]={0, 0, 0};
    boolean A_E[]={0, 0, 0};
    boolean M_E[]={1, 0, 0};
    int Sign=0; //Le signal carré est à l'entrée 3
    int fA; // Frequence de l'alternateur
    int S0; // Résultat de la comparaison
    int fR,a,T; //fR = Fréquence réseau  || T=Période
    long t; //t=Horloge
    char message0[10] = "";
    void setup() {
    S0=0; 
    fR=50; // 50Hz
    pinMode(Sign, INPUT);
    pinMode(S0, OUTPUT);
    }
    
    void loop() {
    a=digitalRead(Sign);
      
      if(a==RISING)
      Tr[0]=1;
      else Tr[0]=0;
      if(a==RISING)
      Tr[1]=1;
      else Tr[1]=0;
      if(1==1)
      Tr[3]=1;
     
     A_E[0]=M_E[2] && Tr[2];
     A_E[1]=M_E[1] && Tr[0];
     A_E[2]=M_E[0] && Tr[1];
     
     M_E[0] = (A_E[0] || M_E[0]) && !Tr[0];
     M_E[1] = (A_E[1] || M_E[1]) && !Tr[1];
     M_E[2] = (A_E[2] || M_E[2]) && !Tr[0];
     
     if(M_E[1]==1) t=millis();
     if(M_E[2]==1)
     { T=(millis() - t)*10^(-3);
       fA=1/T;
       sprintf(message0,"fA= %2d Hz",fA);
       lcd.begin(16,2); 
       lcd.print(message0); 
     }
     
    }
    J'obtiens les erreurs suivantes:
    Code:
    testfr_quence.ino:5:9: error: expected unqualified-id before numeric constant
    testfr_quence.ino: In function 'void loop()':
    testfr_quence.ino:31:14: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:32:14: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:33:14: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:35:7: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:35:27: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:36:7: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:36:27: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:37:7: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:37:27: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:39:10: error: invalid types 'double[int]' for array subscript
    testfr_quence.ino:40:10: error: invalid types 'double[int]' for array subscript
    Erreur lors de la compilation.
    Est ce que quelqu'un aura une idée sur ce type d'erreur? sachant que les deux valeurs du tableaux sont en boolean..
    Merci et bonne journée.

    -----

  2. #2
    jiherve

    Re : error: invalid types 'double[int]' for array subscript

    Bonjour,
    0ù est défini "RISING"?
    A_E[0]=M_E[2] && Tr[2];
    ne serait ce pas plutot
    A_E[0]=M_E[2] & Tr[2];
    ?
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    Slaivers

    Re : error: invalid types 'double[int]' for array subscript

    Tout d'abord, merci pour ta réponse,

    le RISING c'est pour détecter un front montant,

    et j'ai testé avec un seul & mais ça n'a pas marché..

  4. #4
    jiherve

    Re : error: invalid types 'double[int]' for array subscript

    Re
    Pour le & je n'avais pas fait attention au type si ce sont des booléens && c'est correct
    Par contre pour RISING je ne suis pas, cela semble être défini pour attachinterrupt mais pas ailleurs.
    Hors l'usage des fonctionnalités hardware d'interruption pour détecter un front montant ce n'est pas comme çà qu'il faut faire.
    commentes:
    if(a==RISING)
    Tr[0]=1;
    else Tr[0]=0;
    if(a==RISING)
    Tr[1]=1;
    else Tr[1]=0;
    if(1==1)
    Tr[3]=1;
    et recompiles.
    Lorsqu'un compllateur produit des messages d'erreurs incompréhensibles il faut procéder par dichotomie, on commente un bout de code, on compile on regarde le resultat etc etc ceci parce que bien souvent une toute petite erreur de syntaxe induit un dysfonctionnement complet du compilateur,celui ci n’étant pas très robuste.
    JR
    l'électronique c'est pas du vaudou!

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

    Re : error: invalid types 'double[int]' for array subscript

    Oui, tu as raison concernant le RISING, j'ai fait une autre méthode, le changement d'état de a: if(a==!a)...

    Maintenant, le problème, c'est que le LCD n'affiche rien..
    Quand j'ai mis au début du loop :
    Code:
    void loop() {
    a=digitalRead(Sign); // 
    sprintf(message0,"a= %d ",a);
    lcd.begin(16,2); 
    lcd.print(message0);
    ça m'affiche tout le temps a=0 alors que SIGN est un train d’impulsion d'une fréquence de 1Hz

  7. #6
    Slaivers

    Re : error: invalid types 'double[int]' for array subscript

    Le voilà mon nouveau programme, je n'utilise plus les tableaux, mais j'utilise le goto

    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(11,10,5,4,3,2);
    int Sign=13; //Le signal carré est à l'entrée 3
    int fA; // Frequence de l'alternateur
    int S0; // Résultat de la comparaison
    int fR,a,T, var; //fR = Fréquence réseau  || T=Période
    long t; //t=Horloge
    char message0[10] = "";
    void setup() {
    S0=0; 
    fR=50; // 50Hz
    var=0;
    pinMode(Sign, INPUT);
    pinMode(S0, OUTPUT);
    }
    
    void loop() {
    a=digitalRead(Sign); // Lecture de la valeur de l'entrée 3
    
    // Si on détecte un front montant, on enregistre la valeur de l'horloge
    if (a==!a)
      {t=millis();
      var=1;
      goto test1;}
    test1:   if(a==!a && var==1)
         { T=(millis()-t)*10^(-3);}
          else{ goto test1;}
    fA=1/T;
    sprintf(message0,"fA= %d Hz",fA);
    lcd.begin(16,2); //utilisation d'un écran 16 colonnes et 2lignes
    lcd.print(message0); //petit test pour vérifier quetout marche // On calcule la valeur de la fréquence
    //if(fA==fR)
    //  {S0=1;
     // }
     
    }

  8. #7
    jiherve

    Re : error: invalid types 'double[int]' for array subscript

    Bonjour,
    si a==!a est toujours faux
    il faut écrire :
    b=a;
    a=digitalRead(Sign); // Lecture de la valeur de l'entrée 3
    ....
    si a==!b ....
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    Slaivers

    Re : error: invalid types 'double[int]' for array subscript

    Oui oui, c'est bon merci, tu as raison (Y)

  10. #9
    Slaivers

    Re : error: invalid types 'double[int]' for array subscript

    Mon nouveau problème est comme suit :

    Normalement j'ai un train d'impulsion de 50Hz, et je veux calculer sa fréquence à l'aide de ce programme :
    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(11,10,5,4,3,2);
    int Sign=13; //Le signal carré est à l'entrée 3
    // Frequence de l'alternateur
    int S0; // Résultat de la comparaison
    unsigned long fA,fR,T,t,t1, var=0; //fR = Fréquence réseau  || T=Période
    //t=Horloge
    boolean a=0,b;
    char message0[10] = "";
    void setup() {
    S0=0; 
    fR=50; // 50Hz
    pinMode(Sign, INPUT);
    pinMode(S0, OUTPUT);
    }
    
    void loop() {
    b=a;
    a=digitalRead(Sign); // Lecture de la valeur de l'entrée 3
    //Si on détecte un front montant, on enregistre la valeur de l'horloge
    if (a==!b)
     {
      t=millis();
      goto test1;
      }
    else if(a==b) {var=0;}
    
    test1: {    a=digitalRead(Sign);
                if(a==b) 
                {goto test2;}
                 else if(a==!b) {goto test1;}
                 }
                 
    test2: {   a=digitalRead(Sign);
               if(a==!b)
              {t1=millis();
                
               }
               else if(a==b)
               {goto test2;}
             }
             T=(t1-t);
              fA=1000/T;
              sprintf(message0,"T= %d ms",T);
              lcd.begin(16,2); //utilisation d'un écran 16 colonnes et 2lignes
              lcd.print(message0); //petit test pour vérifier quetout marche // On calcule la valeur de la fréquence
             }
    Le résultat que je trouve est de 12ms au lieu de 20ms pour la période.
    Merci d'avance

  11. #10
    jiherve

    Re : error: invalid types 'double[int]' for array subscript

    Re,
    en pseudo code car je ne pratique pas le charabia arduino, je programme surtout en assembleur mais tu devrais t'y retrouver
    Code:
    lbl1:
      b= a;
      a = digitalread(sign)
      if (a==!b)&&(a==1) ; rising edge
       goto lbl2
      else 
       goto lbl1;
    lbl2:
      t1=millis()  
    lbl3:
      b= a;
      a = digitalread(sign)
      if (a==!b)&&(a==1) ; rising edge
        goto lbl4;
      else 
        goto lbl3;
    lbl4:
      t2=millis()  
      T = t2-t1;
     affichage()
     goto lbl1;
    on peut faire plus simple.
    Ceci dit comme le µC présent sur une carte arduino à la fonction timer capture disponible sur le Timer 1 il serait plus judicieux d'utiliser cette fonction car la tout est fait par hard.
    JR
    l'électronique c'est pas du vaudou!

  12. #11
    Slaivers

    Re : error: invalid types 'double[int]' for array subscript

    Je ne trouve pas vraiment quelle est la différence entre mon algorithme et le tien..

  13. #12
    Slaivers

    Re : error: invalid types 'double[int]' for array subscript

    Voilà, j'ai résolu le problème, le nouveau programme est comme suit :
    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(11,10,5,4,3,2);
    int Sign=13; //Le signal carré est à l'entrée 3
    // Frequence de l'alternateur
    int S0; // Résultat de la comparaison
    unsigned long fA,fR,T,t,t1,t2, var=0; //fR = Fréquence réseau  || T=Période
    //t=Horloge
    boolean a,b;
    char message0[10] = "";
    void setup() {
    S0=0; 
    fR=50; // 50Hz
    pinMode(Sign, INPUT);
    pinMode(S0, OUTPUT);
    }
    
    void loop() {
    
    //goto test0;
    //Si on détecte un front montant, on enregistre la valeur de l'horloge
    test0: {
      b=a;
      a=digitalRead(Sign); // Lecture de la valeur de l'entrée 3
    if (a==!b && a==1)
     {
      t=millis();
      goto test1;
      }
    else if(a==b) {goto test0;}
    }
    test1: {    a=digitalRead(Sign);
                if(a==b) 
               {
                goto test2;}
                 else {goto test1;}
                 }
                 
    test2: {   a=digitalRead(Sign);
               if(a==!b && a==1)
              {t1=millis();
              T=(t1-t);
              fA=1000/T;
              sprintf(message0,"fA= %d Hz",fA);
              lcd.begin(16,2); //utilisation d'un écran 16 colonnes et 2lignes
              lcd.print(message0); //petit test pour vérifier quetout marche // On calcule la valeur de la fréquence
              goto test0; 
                
               }
               else if(a==b)
               {goto test2;}
             }
              
           }
    Le seul problème est que la valeur de la fréquence fait des fluctuations autour de 50Hz, normalement ça devrait être fixe, car le train d'impulsion est parfait.

  14. #13
    jiherve

    Re : error: invalid types 'double[int]' for array subscript

    re,
    comme tu fais la mesure par logiciel c'est normal, ton code ne met pas toujours le même temps=> utilisation de la fonction timer, cela nécessite d'utiliser une interruption mais je présume qu'il existe plein d'exemple prémâché sur le net.
    Moi j'ai le code qui va bien mais en assembleur.
    JR
    l'électronique c'est pas du vaudou!

  15. #14
    Slaivers

    Re : error: invalid types 'double[int]' for array subscript

    Interruption c'est à dire?

  16. #15
    Antoane
    Responsable technique

    Re : error: invalid types 'double[int]' for array subscript

    Bonjour,

    Déplacé en électronique.

    https://en.wikipedia.org/wiki/Interrupt
    C'est très classique, tu peux demander à google de t'en parler.
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  17. #16
    freepicbasic

    Re : error: invalid types 'double[int]' for array subscript -- Arduino

    Plus simple, et plus précis

    Code:
    While(digitalRead(Sign)==0);
    t=millis();
    While(digitalRead(Sign)==1);
    While(digitalRead(Sign)==0);
    t1=millis();
    
    T = t1 - t;
    fA=1000/T;
    sprintf(message0,"fA= %d Hz",fA);
    lcd.begin(16,2); //utilisation d'un écran 16 colonnes et 2lignes
    lcd.print(message0); //petit test pour vérifier quetout marche // On calcule la valeur de la fréquence
    
    
    While(digitalRead(Sign)==1);
    A+, pat

Discussions similaires

  1. Récupérer une valeur dans un array qui est lui même dans un array
    Par squal31 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/12/2014, 00h01
  2. Programme Scilab, erreur invalid index
    Par invitec94a53e1 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 16/11/2012, 23h18
  3. Mon 1er programme Arduino ''error: at this point in file"
    Par hary dans le forum Électronique
    Réponses: 6
    Dernier message: 08/03/2012, 11h53
  4. [R] operator is invalid for atomic vectors
    Par gorben dans le forum Logiciel - Software - Open Source
    Réponses: 8
    Dernier message: 18/03/2010, 20h07
Découvrez nos comparatifs produits sur l'informatique et les technologies.