dubbio funzionamento typedef struct

Buon post ferragosto, mi trovo con un dubbio/problema che non riesco a sfoltire.
Ho creato un tipo struttura ricetta per memorizzare dei dati (nome, temperatura, durata)
immaginatevi una ricetta che è composta appunto dal nome del cibo da cuocere, la temperatura di cottura e la durata.
Temperatura e durata possono essere più di uno quindi ho usato un array di int.
L'ho definita così, prendendo spunto dalla dispensa universitaria che avevo.

typedef struct {
  String nome;
  int temperatura[5];
  int durata[5];
} ricetta;

ricetta ricettario[5];

quindi la variabile ricettario[] è un array di ricetta.

Nel mio sketch viene passato l'array ad una funzione che fa delle cose e tutto ok, l'ide di arduino compila e funziona tutto correttamente.
Il primo problema ce l'ho con l'editor Sublime text 3 che uso per editare e compilare, nel momento in cui ho creato la funzione che riceve come argomento l'array di ricetta, compilando mi restituisce un sacco di errori tra cui

redeclared as different kind of symbol
previous declaration

comunque ide arduino compila, carica e il programma funziona perfettamente quindi comincio ad indagare cosa potrebbe essere.

Leggendo scopro che in realtà sulla pagina del playground nonché sul libro "linguaggio C" Kernigan/Ritchie la dichiarazione corretta é:

typedef struct ricetta{
  String nome;
  int temperatura[5];
  int durata[5];
};

ricetta ricettario[5];

ed effettivamente leggendo anche altre fonti scopro che è la versione giusta, in quanto la versione precedente dovrebbe creare una variabile ricetta al che mi chiedo come facesse a funzionare ma sopratutto con questa dichiarazione l'ide di arduino mi restituisce un warning (ma funziona correttamente)

warning: 'typedef' was ignored in this declaration

quindi mi trovo un po' spiazzato perchè non capisco quale sia la definizione giusta, il motivo del warning che comunque risolvo togliendo il typedef ( :o mah??)

In un'altra pagina trovo un ulteriore metodo per definire le strutture...

Sono confuso, confido in un vostro chiarimento. Grazie

allego lo sketch completo anche se sarà inutile e forviante, troppe righe e non ancora completamente commentato nei punti che servirebbero.

Ricorda che su Arduino sei in C++, dove basta:

struct Ricetta {
 // ...
};

Ricetta ricettario[5];

Se proprio vuoi usare la sintassi C, allora è giusto come fai all'inizio:

typedef struct {
  // ...
} Ricetta;

Ricetta ricettario[5];

Per farti capire, questa è una definizione "compressa", perché dovresti definire prima la struct:

struct ricetta_struct {
  // ...
};

E con questa puoi dichiarare una variabile così:

struct ricetta_struct ricettario[5];

Insomma, il nome completo del tipo è "struct ricetta_struct", che è una mezza palla da scrivere, e quindi si abbrevia con typedef:

typedef struct ricetta_struct Ricetta;

A questo punto puoi usare direttamente il tipo Ricetta. La tua dichiarazione fa tutto ciò in una volta, approfittando di una struct anonima, per questo dopo "struct" non c'è niente, intanto non ti ci riferirai mai con quel nome.

ah ok, grazie della spiegazione

Ne approfitto per segnalarti comunque che la classe "String" è bene evitare di usarla su Arduino.
Imposta il parametro "nome" come char[] ed usa la sintassi C.

grazie, non ero ancora a conoscenza di tutti i problemi della String, aggiornerò sicuramente lo sketch.
Peccato perchè per l'uso in sola lettura e allocato globalmente mi era sembrato comodo.

Chiariamo ...
... dato che NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", ma sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu, usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Detto questo, se prioprio non se ne può fare a meno, definire una String, preallocarla con l'apposito metodo reserve(), assegnargli un valore (ovviamente di lunghezza <= allo spazio che si è riservato) ed usarla in sola lettura ... non causa certamente frammentazione della memoria e, volendo, lo puoi fare. :roll_eyes:

Il consiglio comunque resta sempre lo stesso ... impara ad usare le stringhe classiche del C ... ovvero semplici array di "char" terminati dal carattere "null" (0x00) e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h> ... di sicuro NON avrai problemi :smiley:

Guglielmo

gbp01 ma è stata prodotta la scheda 1284 based? magari li già c'è un po più di margine con le risorse... e non ingombra come una 2560....

miky_police:
gbp01 ma è stata prodotta la scheda 1284 based?

Si, la trovi QUI :smiley:

Guglielmo

grazie :smiley: