Struct

Boa Tarde Pessoal,

Tenho esta sctruct:

struct Alarmes {
  int Semana;
  int Hora;
  int Minuto;
  int Som;
}alm[100];

Fiz uma rotina que vai inserindo dados nela....

preciso saber quantos registros tem dentro da struct...

Tentei int contador = sizeof(alm); mas não rola.... ao invés de aparecer a quantidade de registros aparece "800"

como eu faço, alguém pode me ajudar?

Abraços

Se tens um array vais precisar dum “apontador” contador… Essa variavel e que te vai dizer quantos registos estao nela.

O sizeof diz-te o numero de bytes que reservaste nessa variavel. Tu definiste 4 ints, 2 bytes em cada int da 8… vezes 100… 800.

Imaginei, mas não tinha certeza…

preciso de algo mais ou menos assim:

for (i = 0; i < sizeof(alm) - 1; i++){
    Serial.println();
    
    Serial.print("Semana:");
    Serial.print(alm[i].Semana);
    
    Serial.print(" Hora:");
    Serial.print(alm[i].Hora);
    
    Serial.print(" Minuto:");
    Serial.print(alm[i].Minuto);
    
    Serial.print(" Toque:");
    Serial.print(alm[i].Som);
    
    Serial.println();
  }

Mas não Funciona… :slightly_frowning_face:

Sendo assim, penso que o que quer é isto:

com um #define, define-se o valor máximo que a estrutura pode conter:

#define MAX_ALM 100

a partir de aí, passa-se a usar isto, em vez de 100:

struct Alarmes {
  int Semana;
  int Hora;
  int Minuto;
  int Som;
}alm[MAX_ALM];

no seu exemplo ficaria:

for (i = 0; i < MAX_ALM ; i++){
    Serial.println();
    
    Serial.print("Semana:");
    Serial.print(alm[i].Semana);
    
    Serial.print(" Hora:");
    Serial.print(alm[i].Hora);
    
    Serial.print(" Minuto:");
    Serial.print(alm[i].Minuto);
    
    Serial.print(" Toque:");
    Serial.print(alm[i].Som);
    
    Serial.println();
  }

e assim percorrerá toda a estrutura e mostrará todos os valores armazenados.

Não tenho bem a certeza se era esta a dúvida ou não. Se não for diga mais concretamente o que pretende. Espero que não seja que “MAX_ALM” possa ser variável.

Luís, seu exemplo me ajudou.

Obrigado. :slight_smile:

OK. De nada.

Entretanto, lembrei-me que com poucos dias de diferença surgiu em dois locais a mesma questão. Aqui a na "zona Normal" do fórum. Aí outro utilizador também dava uma dica bastante interessante. Pode ver isso aqui.

Eu usei o exemplo para criar um array e salvar os valores na eeprom.

struct config_dos
{
  int dose_personalizada; 
}
dosaconfig[6];
for(byte i = 0; i < 6; i++)
{
  dosaconfig[i].dose_personalizada = (dose_dosadora_personalizada_e[i] * 10);
}

EEPROM_writeAnything(545, dosaconfig);

OK. Fui eu que entendi mal no início. O post original (assim como o que estava em discussão na outra secção) estava relacionado com achar o tamanho do array. No entanto, o seu problema era fazer uma array de structs.