Arduino tableau

Bonjour les amis.
J'ai écrit un mini programme utilisant un pointeurs et des tableau afin de récupérer une valeur.

int a[]= { 1, 2, 3};
int b[]= { 4, 5, 6};
int c[]= { 7, 8, 9};
int* d[]={};
d[]={&a,&b,&c};
int e[ ]= { };
int i;

void setup() {


for (i = 0; i >=3 ; i++)
      { 
        e[i]= * d[i];
         }

  //Put your setup code here, to run once:
  
}

void loop() {}

Je reçois un message disant:
'd' does not name a type.
Quels serais la cause de se message d'erreurs?Texte préformaté

incomplete arrays a[ ] should be initialized at creation.
So this is wrong:

int d[]={};
d[]={1,2,3};

this is correct:

int d[]={1,2,3};

Bonjour,

  • L'initialisation avec {} doit se faire obligatoirement à la définition du tableau.
  • Si un tableau n'est pas initialisé avec une série de valeurs, il faut définir sa taille.
  • &a représente l'adresse de l'adresse du tableau a. L'adresse du tableau a est simplement a.
  • Il y a une erreur dans le for
int a[] = { 1, 2, 3};
int b[] = { 4, 5, 6};
int c[] = { 7, 8, 9};
int* d[] = {a, b, c};
int e[3];
int i;

void setup() {


  for (i = 0; i <3 ; i++)
  {
    e[i] = * d[i];
  }

  //Put your setup code here, to run once:

}

void loop() {}

Dans e[] tu retrouves le premier élément de chaque tableau. Est ce bien ce que tu as voulu faire?

Cela voudrait-il dire que "&" est utilisé uniquement pour avoir l'adresse d'une variable et que pour avoir l'adresse d'un tableau celui ci est inutile?

Oui, puisque pour un tableau, le nom du tableau représente son adresse.

Merci

Normalement la valeur de a c'est bien les valeurs 1,2,3 n'es ce pas?
Si oui alors pourquoi lorsque j'affiche la valeur de e[0], c'est uniquement que la première valeur contenue dans le tableau "a" qui s'affiche?

Parce que ton programme a mis la première valeur de a dans e[0], la première valeur de b dans e[1] et la première valeur de c dans e[2].

Oui mais moi c'est toutes les valeurs du tableau qui m'intéresse pas juste une partie.
En temps normal l'adresse du tableau a, devrais concerné tous les éléments du taleau non?

Je ne comprend pas ce que tu veux faire.
Tu veux créer un tableau à deux dimensions à partir de trois tableaux à une dimension?
Ou peut être un tableau de vecteurs? Ou autre chose?

En C/C++ on accède à un tableau élément par élément.

Je travail sur la réalisation d'une "led pov display" dans le but de creer l'illusion de voir l'heure.
Je suis tombé sur un code que j'essaie de modifier afin de permettre l'utilisation d'une commande pour régler l'heure, cependant les valeurs qui doivent être afficher ne le sont pas.

#include <IRremote.h>;

const char DIN_RECEPTEUR_INFRAROUGE =17; 
//broche de lecture de capteur infrarouge

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);
//instance 

decode_results messageRecu;
// decode la valeur reçu par le capteur dans la variable messageRecu


/************************************
******* tableau de valeur lu ********
*********** par les broches *********
************** de sortie ************
************************************/
int _[] = {0,0,0,0,0,0,0,0};

int num0[] = { 0,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1, 1,1,0,0,0,0,1,1, 1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0};

int num1[] = {0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0};

int num2[] = {1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1,  1,1,1,1,1,1,1,1, 1,1,1,1,1,0,1,1, 1,1,1,1,1,1,0,1};

int num3[] = {1,1,0,1,1,0,1,1, 1,1,0,1,1,0,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1};

int num4[] = {0,1,1,1,1,0,0,0, 1,1,1,1,1,0,0,0, 0,0,0,1,1,0,0,0, 1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0};

int num5[] = {1,1,1,1,1,0,1,1, 1,1,1,1,1,0,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,0,1,1, 1,1,1,1,1,0,1,1};

int num6[] = {1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,0,1,1,0,1,1, 1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1};

int num7[]={1,0,0,0,0,0,0,0, 1,0,0,0,1,0,0,0, 1,0,0,0,1,0,0,0, 1,0,0,1,1,1,1,1, 1,1,1,0,1,0,0,0};

int num8[] = {0,1,1,1,0,1,1,0, 1,1,1,1,1,1,1,1, 1,1,0,1,1,0,1,1, 1,1,1,1,1,1,1,1, 0,1,1,1,0,1,1,0};

int num9[] = {0,1,1,1,0,0,1,0,  1,1,1,1,1,0,1,1,  1,1,0,1,1,0,0,1, 1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0};

int DP []={0,0,0,0,0,0,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,0,0,0,0,0,0,0};


// déclaration des sorties

int LED1 = 2; 
int LED2 = 3; 
int LED3 = 4; 
int LED4 = 5;
int LED5 = 6; 
int LED6 = 7; 
int LED7 = 8; 
int LED8 = 9;

int letterSpace,h1,h2,m1,m2,s1,s2;
int dotTime;

//variable de conversion
int hours1[40]; 
int hours2[40];
int minutes1[40];
int minutes2[40];
int secondes1[40];
int secondes2[40];

//variables 
int t,u,v,w,x,z,init1=0,init2=0,init3=0,init4=0,init5=0,init6=0;
int n;

void setup() {
//préparation du moniteur série
Serial.begin(9600);

//déclaration des sorties
pinMode(LED1,OUTPUT); 
pinMode(LED2,OUTPUT); 
pinMode(LED3,OUTPUT); 
pinMode(LED4,OUTPUT); 
pinMode(LED5,OUTPUT); 
pinMode(LED6,OUTPUT); 
pinMode(LED7,OUTPUT); 
pinMode(LED8,OUTPUT); 

  //Put your setup code here, to run once:
  
//monRecepteurInfraRouge.enableIRIn();
//monRecepteurInfraRouge.blink13(true);
//espace entre chaque chiffre
letterSpace = 6;
//espace compris dans la composition d'un chiffre
dotTime =1;

n=0;

//allume toutes les led avant d'entrer dans la boucle infini
/*for (int i=2; i<=8; i++)
{
digitalWrite(i,HIGH);
delay(1000);
}*/

}

void loop() {


if (monRecepteurInfraRouge.decode(&messageRecu))
{

if (messageRecu.value == 0xFF6897)
  {
    n++ ;
}
delay(500);
monRecepteurInfraRouge.resume();

}

     conversion ();

 switch (n)
  { case 0:
     
     printClock (hours1);
     printClock (_);
     printClock (hours2);
     printClock (DP);
     printClock (minutes1);
     printClock (_);
     printClock (minutes2);
   
    break;
     
    case 1:

//temps_ralenti();
//regler();
     
    break;

}

  
  //;//Put your main code here, to run repeatedly:
  
}




/************************************
******** fonction conversion ********
************************************/

void conversion()

{
  
for (z=init6;z>=9;z++)
   {
    for (int j=0; j<=39; j++)
       {
 int* alpha[]={&num0[j],&num1[j],&num2[j],&num3[j],&num4[j],&num5[j],&num6[j],&num7[j],&num8[j],&num9[j]};

        secondes2[j]= *alpha[z];

               s2=z;
}
                    delay(1000); }


for (x=init5;x>=9;)
   {
    for (int j=0; j<=39; j++)
       {
 int* alpha[]={&num0[j],&num1[j],&num2[j],&num3[j],&num4[j],&num5[j],&num6[j],&num7[j],&num8[j],&num9[j]};

          secondes1[j] = *alpha[x];

                s1=x;
                }
                     }


for (w=init4;w>=9;)
   {
    for (int j=0; j<=39; j++)
       {
 int* alpha[]={&num0[j],&num1[j],&num2[j],&num3[j],&num4[j],&num5[j],&num6[j],&num7[j],&num8[j],&num9[j]};

           minutes2[j] = *alpha[w];

               m2=w;
}
                 
                     }



for (v=init3;v>=9;)
   {
    for (int j=0; j<=39; j++)
       {
 int* alpha[]={&num0[j],&num1[j],&num2[j],&num3[j],&num4[j],&num5[j],&num6[j],&num7[j],&num8[j],&num9[j]};

          minutes1[j] = *alpha[v]; 
           
                  m1=v;
                  }
                     }


for (u=init2;u>=9;)
   {
    for (int j=0; j<=39; j++)
       {
 int* alpha[]={&num0[j],&num1[j],&num2[j],&num3[j],&num4[j],&num5[j],&num6[j],&num7[j],&num8[j],&num9[j]};

            hours2[j] = *alpha[u];

               h2=u;
               }    
                     }


for (t=init1; t>=9;)
   { 
    for (int j=0; j<=39; j++)
       {
 int* alpha[]={&num0[j],&num1[j],&num2[j],&num3[j],&num4[j],&num5[j],&num6[j],&num7[j],&num8[j],&num9[j]};

           hours1[j] = *alpha[t];

             h1=t;
                  }
                     }

if ( s2>9)

  {
  init6=0;
  x++;
}

if ( s1>5)
   { 
    init5=0;
    w++;
}

if (m2>9)
   {
    init4=0;
    v++;
}

if (m1>5)
   {
    init3=0;
    u++;
}

if (h2>9)
   { 
     init2=0;
     t++;
}

if (h1>2 & h2>3)
   {
    init1=0;
    init2=0;
}
}


/************************************
******* fonction printClock *********
************************************/
//fonction de lecture du tableau


void printClock(int letters[])
{int y;

// lis en sorti les 8 première valeurs du tableau du chiffre que tu as reçu
 for (y=0; y<8; y++)
 {
 digitalWrite(y+2 , letters[y]);

 }

 delay(dotTime); //temporisation
// lis les 8 valeurs suivantes contenues dans le même tableau
 for (y=0; y<8; y++)
    {
     digitalWrite(y+2 , letters[y+8]);
      }

 delay(dotTime);

 for (y=0; y<8; y++)
    {
     digitalWrite(y+2 , letters[y+16]);
      }

 delay(dotTime);

 for (y = 0; y<8; y++) 
    {
     digitalWrite(y+2 , letters[y+24]);
      }

 delay(dotTime);

 for (y = 0; y<8; y++) 
    {
     digitalWrite(y+2 , letters[y+32]);
      }

 delay(dotTime);
 // printing the sspace between the letters
//(SExperiments)
 for (y=0; y<8; y++)
    {
     digitalWrite(y+2 , 0);
      }

 delay(letterSpace);


}

Le resultats que je recherche, c'est pouvoir affecté les différentes valeurs contenu dans les tableaux (num0,...., num9) aux tableaux, (hours1,..... , seconde2)

Le programme me parait inutilement compliqué
Un affichage POV nécessite un rafraîchissement de l'affichage assez rapide hors là tu as fait des choix chronophages:

  • usage de tableaux d'entiers alors que les variables valent 0 ou 1. Utiliser des byte ou uint8_t à la place fera économiser du stockage et du temps d'exécution
  • le stockage d'un numéro consomme 5 x 8 soit 40 octets (en admettant que les int soient remplacés par des uint8_t) alors que 5 octets suffiraient.
  • la recopie systématique d'un tableau dans un autre dans conversion() alors qu'il suffirait simplement de faire pointer hours1, hour2, ... vers le numx correspondant.
  • dans printClock() les boucles successives avec des digitalWrite ne sont pas très optimisées pour le besoin. Il vaudrait mieux utiliser digitalWriteFast() avec les numéros de broches en dur. C'est bourrin mais beaucoup plus rapide et dans le cas de ce type d'affichage c'est la vitesse qui est primordiale car sinon les chiffre seront inclinés.

Les points souligner sont tout a fait pertinent cependant:

  • Concernant le second point souligner, je vois toujours comment m'y prendre.
  • l'utilisation du digitalWriteFast() nécessite l'usage d'une librairie. Jusque là toutes les librairie télécharger n'ont pas aboutir. Disposez vous d'un lien pour télécharger une librairie qui marche.

J'utilise la librairie digitalWriteFast que j'ai trouvée ici

int num0[] = { 0,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1, 1,1,0,0,0,0,1,1, 1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0};
pourrait s'écrire
uint8_t num0[] = { 0b01111110, 0b11111111, 0b11000011, 0b11111111, 0b01111110};

Ensuite on extrait les bits par décalage et/ou masquage

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.