help nodig bij het vullen array met startwaarden [OPGELOST]

Hey,

ik heb wat problemen bij het initialiseren van startwaarden in één set van een array

struct Heat
{
  long wisselTijd;
  long loopTijd;
  long wissel;
  long heatTijd;
  long race;
  long raceWissels;
  float wisselDecimal;
  float looptijdDecimal;
  float raceDecimal;
  float racewisselsDecimal;
  char wisselTxt[6];
  char heatTxt[7];
  char racewisselsTxt[8];
  char racelooptijdTxt[8];
} Heat[8];
//---- initialiseren loopTijd(en) ----
Heat[1].loopTijd = 0;
Heat[2].loopTijd = 0;
Heat[3].loopTijd = 0;
Heat[4].loopTijd = 0;
Heat[5].loopTijd = 0;
Heat[6].loopTijd = 0;
Heat[7].loopTijd = 0;
Heat[8].loopTijd = 0;

ik krijg van de compiler volgende fout:

  • error: expected constructor, destructor, or type conversion before '.' token -

de waarde van Heat["x"].loopTijd wil ik gebruiken als een flag verder in het programma, zeg maar als de waarde > 0 dan doe ik iets

iemand een idee?

Grtz,
Yves

Ik vermoed dat de compiler er niet uitkomt omdat je de struct heat noemt en vervolgens de fysieke tabel ook. Je mag de naam van de struct ook weglaten.

stop de initialisatie in een separate functie

struct Heat
{
  long wisselTijd;
  long loopTijd;
  long wissel;
  long heatTijd;
  long race;
  long raceWissels;
  float wisselDecimal;
  float looptijdDecimal;
  float raceDecimal;
  float racewisselsDecimal;
  char wisselTxt[6];
  char heatTxt[7];
  char racewisselsTxt[8];
  char racelooptijdTxt[8];
} 
Heat[8];

void initializeHeat(int idx)
{
  Heat[idx].loopTijd = 0;
  // rest vd initialisatie
}

void setup() 
{
  Serial.begin(115200);
  Serial.println("Start ");

  for (int i=0; i < 8; i++) initializeHeat(i);

  // print 4 for example
  Serial.println(Heat[4].loopTijd);

}

void loop() 
{
}

bedenk dat array's in C/C++ lopen altijd vanaf 0 en niet vanaf 1.

HEAT[8] heeft dus valide indexen {0,1,2,3,4,5,6,7} 8 gaat dus fout.

YvesD
Achtergrond: Ik ben het eens met alle opmerkingen hierboven en die blijven ook geldig als je de code die ik hier plaats gebruikt. Wat ik hier aanlever als code is niet "hoe ik het zou doen" maar "hoe ik je makkelijkst duidelijk kan maken "hoe het beter/makkelijker kan"

Als ik je code zie -en ik bedenk dat je pas begonnen bent- zou ik voorstellen om class te gebruiken inplaats van struct.
Technisch gezien is een struct -in C++- een class waar geen methoden kunnen ingevuld worden en waar alle members public zijn.
Jouw code letterlijk vertaald naar class geeft.

class HeatClass
{
 public:
  long wisselTijd;
  long loopTijd;
  long wissel;
  long heatTijd;
  long race;
  long raceWissels;
  float wisselDecimal;
  float looptijdDecimal;
  float raceDecimal;
  float racewisselsDecimal;
  char wisselTxt[6];
  char heatTxt[7];
  char racewisselsTxt[8];
  char racelooptijdTxt[8];
};
..
HeatClass Heat[8];
//---- initialiseren loopTijd(en) ----
Heat[0].loopTijd = 0;
Heat[1].loopTijd = 0;
Heat[2].loopTijd = 0;
Heat[3].loopTijd = 0;
Heat[4].loopTijd = 0;
Heat[5].loopTijd = 0;
Heat[6].loopTijd = 0;
Heat[7].loopTijd = 0;

Als je echter class functionaliteit gebruikt kan het ook zo.

class HeatClass
{
 public:
  long wisselTijd;
  long loopTijd;
  long wissel;
  long heatTijd;
  long race;
  long raceWissels;
  float wisselDecimal;
  float looptijdDecimal;
  float raceDecimal;
  float racewisselsDecimal;
  char wisselTxt[6];
  char heatTxt[7];
  char racewisselsTxt[8];
  char racelooptijdTxt[8];
  HeatClass(){loopTijd = 0;};
};
HeatClass Heat[8];

En dit doet echt letterlijk hetzelfde.
Een class kan een speciale methode hebben met dezelfde naam als de class zelf. Deze methode wordt opgeroepen als het object gemaakt wordt. met

HeatClass Heat[8];

Maak je 8 keer een object HeatClass aan dan wordt dus ook 8 keer

HeatClass(){loopTijd = 0;};

uitgevoerd.

Waarom is dit beter (volgens mij)?
Omdat je dan ook methoden kunt toevoegen. Ik zie bijvoorbeeld in je struct staan
char racewisselsTxt[8]; en long raceWissels;
waarschijnlijk is de racewisselsTxt een andere representatie van raceWissels. De 2 in sync houden is niet zo makkelijk met een struct. Elke keer als je raceWissels aanpast moet je ook racewisselsTxt aanpassen.
In een class kan je dat als volgt doen

class HeatClass
{
 private:
 long raceWissels;
 public:
  long wisselTijd;
  long loopTijd;
  long wissel;
  long heatTijd;
  long race;
  float wisselDecimal;
  float looptijdDecimal;
  float raceDecimal;
  float racewisselsDecimal;
  char wisselTxt[6];
  char heatTxt[7];
  char racewisselsTxt[8];
  char racelooptijdTxt[8];
  void setRaceWissels(long newNumberOfRaceWissels)
  {
   raceWissels=newNumberOfRaceWissels;
   racewisselsTxt=convertRaceWisselsToText(raceWissels);
  }
 long getRaceWissels(){return raceWissels;};
};

Ik heb raceWissels private gemaakt. Dat wil zeggen dat je niet meer aan raceWissels kan komen. In de code vertaalt zich dat als volgt: volgende code geeft een of meerder fout boodschappen voor elke lijn

Heat[7].raceWissels=12;
if(Heat[7].raceWissels<521)

maar als je het volgende schrijft komt het goed

Heat[7].setRaceWissels(12);
if(Heat[7].getRaceWissels()<521)

En hier komt mijn punt .......
Ook al lijken deze 2 lijntjes heel goed op elkaar en zodanig is er dus geen enkele reden om naar een class te gaan .....

Maar....de eerste code (met de struct dus) heeft een functionele bug en de tweede code niet!!!
Denk er eens goed over na en selecteer daarna zone hieronder als je denkt et te weten

bij de eerste code is racewisselsTxt niet correct en bij de tweede code wel.
Dit komt omdat setRaceWissels zowel raceWissels als racewisselsTxt aanpast

Hey Nico, Rob & Jantje,

hier kom ik ECHT een héél eind mee vooruit...
bedankt daarvoor!

ik ga eerst de struct methode gebruiken, maar nadien wil ik wel de class methode gaan toepassen.
ik denk dat de class methode voor een beginner iets meer uitdaging vormt, maar mogelijks maak je er "mooiere" en overzichtelijkere code mee.

de "methodes" doen me wat denken aan Delphi indertijd waar je aan een object wat speciale eigenschappen kon toekennen bij het opmaken ervan...dus dat moet wel lukken om daar in mee te gaan :slight_smile:
en ik denk dat ik net met die methodes wel nog een paar nuttige dingen kan uithalen voor m'n projectje.

ik hou jullie alvast op de hoogte (ben een weekje in verlof :slight_smile: )

grtz,
Yves

PS : er is iets gewijzigd aan het forum, en nu krijg ik via mail geen waarschuwingen meer als er een reply is??? had dat nochtans aangezet...

Hey,

net het voorbeeld van Rob uitgeprobeerd, maar daar krijg ik geen "0" op de monitor te zien..

dan maar de code van Jantje eens genomen, maar daar krijg ik dan weer die compiler melding van hierboven

moet ik mogelijks nog een bibliotheek toevoegen ofzo?

nu heb ik de volgende reeds staan...

//---- Hieronder komen de nodige bibliotheken ----
#include <Adafruit_NeoPixel.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <stdlib.h>

Grtz,
Yves

edit : trek m'n opmerking over de code van Jantje terug, had niet het juiste stukje code geselecteerd (had de "vertaling van struct -> class genomen - mea culpa)

MAAR.. ik krijg ook op deze wijze (class)) geen "0" op m'n monitor te zien...

Hey,

GELUKT !!

heb net de code van jantje nog eens stap na stap doordacht en nu lukt het wel, ik had het stukje code van rob niet verwijderd in de setup zone.

dus als ik nu via de seriële monitor gegevens opvraag, dan krijg ik mooi voor alle records een Heat["x"].loopTijd = 0...

ik kan weer even verder,

Thanks gasten voor jullie eindeloos geduld met mij :slight_smile:

Grtz,
Yves