Go Down

Topic: Probelma con Typedef struct  (Read 270 times) previous topic - next topic

Rob123


Ciao a tutti;

Perchè se posso leggere e scrivere i valori richiamandoli dall'array e non posso ne leggere ne scrivere i valori sulla variabile singola?

Il serial.print nel ciclo loop è un esempio.

Code: [Select]




unsigned long Pgiro;

typedef struct { 
  const char nome[7];   // Nome del contatto
  const byte pin;       // Pin di arduino
  boolean attuale;
  boolean precedente;
  boolean futuro;
  } InOut;
// nota A0=54 A15=69
       
 InOut    Nome1  = { "Nome 1", 26 , 0 , 0 , 0 }, // 0
          Nome2  = { "Nome 2", 27 , 0 , 0 , 0 }, // 1
          Nome3  = { "Nome 3", 28 , 0 , 0 , 0 }, // 2
          Nome4  = { "Nome 4", 29 , 0 , 0 , 0 }, // 3
          Nome5  = { "Nome 5", 30 , 0 , 0 , 0 }, // 4
          Nome6  = { "Nome 5", 31 , 0 , 0 , 0 }, // 4           
          Nome7  = { "Nome 5", 32 , 0 , 0 , 0 }, // 4           
          Nome8  = { "Nome 5", 33 , 0 , 0 , 0 }, // 4           
          Nome9  = { "Nome 5", 34 , 0 , 0 , 0 }, // 4           
          Nome10 = { "Nome 5", 35 , 0 , 0 , 0 }; // 4           
 
 
 InOut ArrayIn[]  { Nome1, Nome2, Nome3, Nome4, Nome5  };
 InOut ArrayOut[] { Nome6, Nome7, Nome8, Nome9, Nome10 };
 
void setup() { Serial.begin(115200);

for (int x=0; x<5; x++) { pinMode (ArrayIn [x].pin,  INPUT  ); // Imposto i pin come INPUT
                         
                          digitalWrite(ArrayIn[x].pin,HIGH);}  // Attivo la resistenza interna di pullup

for (int x=0; x<5; x++) { pinMode (ArrayOut[x].pin, OUTPUT  ); } // imposto i pin come OUTPUT




delay(350); } // Fine void setup





void loop(){
 
  unsigned long Tgiro = millis();

  if ( Tgiro > Pgiro+500 ) {

   
    for (int x=0; x<5; x++) {       
     
      ArrayIn[x].attuale = digitalRead (ArrayIn[x].attuale); // Aggioro il valore di "variabile.attuale" leggendo il rispettivo "variabile.pin"
     
      }//fine ciclo for



    for (int x=0; x<5; x++) {   
     
      digitalWrite (ArrayOut[x].attuale , ArrayOut[x].futuro ); //Imposto l'uscita in funzione della variabile futuro
                 
      ArrayOut[x].attuale =  digitalRead (ArrayOut[x].pin); } // aggiorno il valore di "variabile.attuale"
   
 
 
  Pgiro=Tgiro;}// fine IF


  Serial.println( ArrayIn[1].attuale ); // funziona
 
  Serial.println( Nome1.attuale ); // non funziona


} //Fine void loop

nid69ita

#1
Oct 10, 2016, 02:10 pm Last Edit: Oct 10, 2016, 02:13 pm by nid69ita
ArrayIn e Out dovrebbero essere dei puntatori alle variabili NameX  ?

P.S. usa CTRL+T nell IDE che lo indenta meglio e togli quelle ennemila righe vuote che non servono
my name is IGOR, not AIGOR

nid69ita

#2
Oct 10, 2016, 02:20 pm Last Edit: Oct 10, 2016, 02:23 pm by nid69ita
Se si, probabilmente la sintassi che hai usato non è corretta.
come hai scritto tu, ArrayIn e ArrayOut  non sono puntatori alle variabili NomeX ma sono ulteriori struct inizializzati con i valori presi (copiati) dalle NomeX

Prova a dichiararle invece così:
Code: [Select]
InOut* ArrayIn[]  { &Nome1, &Nome2, &Nome3, &Nome4, &Nome5  };

Ovviamente ora ArrayIn è un vettore di puntatori e quindi NON puoi usare la sintassi con il punto per accedere agli elementi della struttura:
Code: [Select]
Serial.println( ArrayIn[1].attuale );
Ma devi usare il simbolo ->      che è l'abbreviazione di      (*(pointer)).membro
Code: [Select]
Serial.println( ArrayIn[1]->attuale );
Serial.println( Nome1.attuale );  

Nota che Nome1 usa il punto perchè non è un puntatore.
my name is IGOR, not AIGOR

Rob123


Ti ringrazio moltissimo, non sai da quanto tempo ero arenato su questo errore.

E soprattutto ora il programma funziona, stavo cominciando a sognarmelo di notte.



 

Go Up