Inizializzazione oggetto struttura

Buonasera a tutti :slight_smile:
Ho dichiarato una struttura del tipo:

struct assi
{
  bool STATO;
} X, Y, Z;

Dopo, al di fuori delle funzioni, ho provato ad inizializzare un oggetto della struttura:

X.STATO=LOW;

Ma spunta il seguente errore:

error: 'X' does not name a type

Come mai?

Posta il codice completo

non è questo il problema, ma la bool dev'essere true o false, non LOW che sarebbe 0.
o sbaglio?

dab77:
non è questo il problema, ma la bool dev'essere true o false, non LOW che sarebbe 0.
o sbaglio?

LOW, false e 0 sono la stessa cosa. Stessa cosa HIGH, true e 1.

nid69ita:
Posta il codice completo

struct assi
{
  bool STATO;
  float POSIZIONE;
  ...
} X, Y, Z;

X.STATO=LOW;

void FUNZIONE()
{
  digitalWrite(PIN, X.STATO);
  ...
}

L'errore visualizzato è quello scritto in precedenza

X.STATO=LOW;
forse ma non né sono sicuro
struct X.STATO=LOW;

altrimenti devi usare il typedef insieme allo struct.

Ma non puoi inizializzare in quel modo un elemento di una struttura.
Ma poi che codice è ? la setup() e la loop() dove sono ? :o

Così compila:

struct assi
{ bool STATO;
  float POSIZIONE;
} X, Y, Z;

void setup()
{ X.STATO=LOW;
}

void loop()
{ digitalWrite(12, X.STATO);
}

nid69ita:
Ma non puoi inizializzare in quel modo un elemento di una struttura.
Ma poi che codice è ? la setup() e la loop() dove sono ? :o

Così compila:

struct assi

{ bool STATO;
  float POSIZIONE;
} X, Y, Z;

void setup()
{ X.STATO=LOW;
}

void loop()
{ digitalWrite(12, X.STATO);
}

Quella è una porzione del codice. Il programma completo è formato da 300 righe.
Lo so che un oggetto di una struttura si deve inizializzare nel setup() ma volevo sapere se era possibili inizializzarlo al di fuori di tutto.

giuseppedandrea:
Quella è una porzione del codice. Il programma completo è formato da 300 righe.
Lo so che un oggetto di una struttura si deve inizializzare nel setup() ma volevo sapere se era possibili inizializzarlo al di fuori di tutto.

No, non puoi nello spazio delle dichiarazioni delle variabili globali.
Li è come se tu volessi fare:

int arr[5];
arr[0]=3;  // non puoi in spazio globale

La seconda istruzione è già codice da eseguire non una semplice inizializzazione.
Però puoi fare:

int arr[]={3,3,3,3,3};

Quindi questo dovrebbe accettarlo (me lo compila ma non posso provare):

struct assi
{ bool STATO;
  float POSIZIONE;
} ;

struct assi X = {LOW,0.0};
...

Se poi usi typedef "accorci" il codice:

typedef struct assi
{ bool STATO;
  float POSIZIONE;
} t_assi;

t_assi X = {LOW,0.0};
t_assi V[]={ {LOW,0.0},{LOW,1.0},{LOW,3.0} };     // vettore di 3 elementi da 0 a 2

Ti ringrazio per l'aiuto che mi stai fornendo.
L'ultima soluzione funziona.
Un 'ultima domanda:

struct assi
{ 
  bool STATO=true;
  float POSIZIONE;
} X, Y, Z;

Così facendo X.STATO, Y.STATO E Z.STATO saranno tutti inizializzati a "true"?

Non compila, non è una sintassi accettata.

A me si

A me si

Attenzione a struct in C++. In C++ la parola chiave "struct" è simile alla parola chiave "class".

Non capisco in base a quale logica il compilatore inizializzi la variabile. Ragionandoci su si può supporre che vista la similitudine di "struct" e "class" sia possibile dichiarare e inizializzare un membro di struct per sopperire alla mancata possibilità di specificare un costruttore.

In effetti il compilatore non ha alcun impedimento ad inizializzare una variabile nella fase di dichiarazione, tuttavia "struct assi..." è da considerare una "definizione di tipo", mentre "X, Y, Z;" è una dichiarazione.

Pertanto per coerenza l'inizializzazione di STATO dovrebbe essere fatta durante la dichiarazione di "X, Y, Z;" e non nella definizione.

Ora non ho tempo (e manco voglia) di indagare sul perché funziona.

Ciao.

MauroTec:
Ora non ho tempo (e manco voglia) di indagare sul perché funziona.

Lo strano che a me non compila (IDE 1.0.6) e a @giuseppe si !!

il c++ usa le strutture come se fossero classi, permettendo anche il codice postato sopra.
Ma non solo si potrebbe anche definire una funzione al suo interno proprio come fosse una classe, questo però non l'ho mai testato se su arduino funziona.

struct {
    bool s = true;
    void reset() { s = false;}
    int getS() { return s;}
}a,b,c;

Tutto questo naturalmente non è valido per il C che non permette neanche l'assegnazione all'interno della struttura stessa.