Array verwerking probleem

Arduino specifieke Software
Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Array verwerking probleem

Berichtdoor snewpers » 21 Sep 2016, 12:34

Hoi

Ik heb 3 arrays (menu0, menu1 etc) elk met op positie 'o' het aantal waarden in die array. In het voorbeeld heeft ieder array 6 waarden.

Nu wil ik aan de hand van 'MenuCombo', welke het woord 'menu' combineert met de waarde in 'CurrentMenu'. Dus in onderstaand voorbeeld is dat 'menu2'.

Ik wil de waarde van 'menuCombo' gebruiken in een for loop, door daar de waarden van 'menu2' te laden en de max i-waarde te vullen met waarde '0' uit de geselecteerde array.

Dus in dit geval zou deze 6 moeten zijn voor menu twee. De serialprint moet dan lopen van 1-6, m.a.w. de '0' waarde vervalt en alleen de waarden 1-5 moeten worden getoond.

De onderstaande [eerste] code geeft een foutmelding welke ik niet wegkrijg, de tweede code heeft de variabele 'MenuCombo' vervangen door een vaste waarde 'menu2'. Dan werkt het prima.
Iemand een idee?


csharp code
String menu0[] = {"6","CW","CCW","MIX","No","Yes"};  
String menu1[] = {"6","rood","geel","groen","blauw","paars"};
String menu2[] = {"6","A","B","C","D","E"};

int CurrentMenu = 2; // selected menu number
String MenuName = "menu"; // a name for the arrays

String MenuCombo = MenuName + CurrentMenu; // this combines it into 'menu2' or 'menu3'



void setup() {}



void loop() {
Serial.begin(9600);


Serial.println(" ");
Serial.println("MENU ITEMS");


for (int i=1; i < MenuCombo[0].toInt(); i++) // grab array value 0 to set max value of i but start at value 1
{Serial.println(MenuCombo[i]);} // display the content of array values
delay(1000);

Serial.println(" ");

}



deze werkt wel...
csharp code
String menu0[] = {"6","CW","CCW","MIX","No","Yes"};  
String menu1[] = {"6","rood","geel","groen","blauw","paars"};
String menu2[] = {"6","A","B","C","D","E"};

int CurrentMenu = 2; // selected menu number
String MenuName = "menu"; // a name for the arrays

String MenuCombo = MenuName + CurrentMenu; // this combines it into 'menu2' or 'menu3'



void setup() {}



void loop() {
Serial.begin(9600);


Serial.println(" ");
Serial.println("MENU ITEMS");


for (int i=1; i < menu2[0].toInt(); i++) // grab array value 0 to set max value of i but start at value 1
{Serial.println(menu2[i]);} // display the content of array values
delay(1000);

Serial.println(" ");

}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Array verwerking probleem

Berichtdoor Koepel » 21 Sep 2016, 14:45

Weet je zeker dat je String objects wilt gebruiken ? Toch niet in een Arduino Uno mag ik hopen ?

De naam van een variabele in de code kan niet geselecteerd worden door die naam als tekst te maken. Die twee hebben voor de compiler niets met elkaar te maken.

Jouw 'menu2' variabele is een array van String objects. Dat array bestaat uit de teksten "6", "A", "B", enzovoorts.
De 'MenuCombo' is een ander String object (maar geen array). Je kunt daar de tekst "menu2" in stoppen, maar dat heeft niets te maken met de variabele die 'menu2' heet. Het is niet mogelijk om die twee met elkaar te verbinden.

Om iets uit een array te kiezen, wordt altijd een index gebruikt. Dat is dus een integer binnen de '[' en de ']' haakjes.

Natuurlijk kun je .toInt() gebruiken om een integer uit een tekst te plukken, en die als index te gebruiken. Het lijkt mij omslachtig, maar het werkt. In you eerste sketch staat "MenuCombo[0].toInt()", maar je bedoelt waarschijnlijk "MenuCombo.toInt()", want MenuCombo is geen array. Om dan vervolgens naar "menu[x]" te gaan zouden de "menu1", "menu2" en "menu3" tesamen in een array moeten zitten.

Wat dacht je van een 'struct' ? Die zou je later in flash geheugen kunnen plaatsen om ram geheugen te besparen.
Een struct combineert verschillende soorten variabelen in één pakket. Ik heb meteen de String object weggedaan, en ik gebruikt integers als integers:
Code: Alles selecteren
// voor : http://arduinoforum.nl/viewtopic.php?f=8&t=2009
// Arduino.cc IDE 1.6.11, Arduino Uno.

// De struct kan een vast aantal karakters hebben,
// zodat het gemakkelijker is om het in PROGMEM te zetten.
// Dan wordt het bijvoorbeeld: char tekst[5][10];
// Nu zijn het pointers naar tekst die in ram staat.

struct myMenu_STRUCT
{
  int nummer;
  char *tekst[5];
};

myMenu_STRUCT myMenu[] =
{
  { 6, "CW", "CCW", "MIX", "No", "Yes" },
  { 6, "rood", "geel", "groen", "blauw", "paars" },
  { 6, "A", "B", "C", "D", "E" },
};

void setup()
{
  Serial.begin( 9600);

  Serial.println();
  Serial.println("   ");
  Serial.println("MENU ITEMS");

  for( int i=0; i<3; i++)
  {
    Serial.print( "menu ");
    Serial.print( i);
    Serial.print( " : ");

    Serial.print( myMenu[i].nummer);
    Serial.print( ", ");

    for( int j=0; j<5; j++)
    {
      Serial.print( myMenu[i].tekst[j]);
      Serial.print( ", ");
    }
    Serial.println();
  }
}

void loop()
{
}

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Array verwerking probleem

Berichtdoor snewpers » 21 Sep 2016, 15:49

Bedankt Koepel!

Ik had al naar Struct gekeken... ik ga dat nu nog eens doen, ik begrijp dat het niet efficient is wat ik tot nu toe heb gedaan :)

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Array verwerking probleem

Berichtdoor Koepel » 21 Sep 2016, 16:57

Het zit vrij logisch in elkaar. Een 'struct' is een pakket van variabelen waarin je van alles kwijt kunt in iedere volgorde.

Kijk hier eens naar:
Code: Alles selecteren
int i = 3;
Serial.println( i);

De compiler weet wat 'int' is, dus dat is eenvoudig. Bij een struct zul je zelf moeten aangeven hoe de struct er uit ziet.
De compiler begrijpt ook "i = 3". De variabele krijgt de waarde drie. Bij een struct kun je zelf dat hele pakket invullen.

Dus "int i = 3" komt overeen met dit:
Code: Alles selecteren
struct
{
  int nummer;
} myFirstStruct =
{
  3
};

Serial.println( myFirstStruct.nummer);

Zie je de definitie en de naam en het invullen er van ? En zie je hoe een onderdeel van de struct met een punt wordt gedaan ? Dat is alles, meer is er eigenlijk niet. Als je het tot zover begrijpt, dan zit je goed :D

Die struct bestaat alleen nog uit een integer, maar je kunt daar pointers, float nummers, arrays, van alles aan toevoegen.

Scroll nu terug naar mijn vorige post, daar gebruik ik eerst een deel dat de 'struct' definieert met 'myMenu_STRUCT'. Dan weet de compiler hoe dat type er uit ziet. Pas daarna gebruikt ik het type 'myMenu_STRUCT' om de struct 'myMenu' te maken. Dat is ook nog eens een array, en dat ga ik daar allemaal invullen.

Het opsplitsen naar de definitie en de variabele is vaak erg handig. Stel dat je een pointer naar 'myMenu' nodig hebt. Dan kun de definitie van het type gebruiken om een pointer te maken:
Code: Alles selecteren
myMenu_STRUCT *pMenu;


Er is iets speciaals met een struct. De struct variabele is geen pointer. Als je wel een pointer gebruikt, dan is de -> nodig in plaats van een punt.
Code: Alles selecteren
myMenu_STRUCT *pMenu;

pMenu = myMenu[0];
Serial.println( pMenu->nummer);

Dat is dus een wezenlijk verschil met een array. De naam van een array is namelijk wel een pointer.

Als je dit allemaal begrijpt, dan ben je expert in de struct.

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Array verwerking probleem

Berichtdoor snewpers » 28 Sep 2016, 12:35

Hoi Koepel

Ik heb naar struct gekeken en ga er mee aan de slag!

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Array verwerking probleem

Berichtdoor Koepel » 28 Sep 2016, 22:40

Als het maar geen XY Problem is : http://xyproblem.info/.
De enige reden voor een struct is het combineren van verschillende soorten variabelen. Ik deed dat omdat je een nummer (6) combineert met tekst.
Als dat nummer niet nodig is, dan is een struct niet nodig. Als dat nummer de hoeveelheid teksten is, dan kan het ook door de laatste tekst een NULL te maken of leeg "".

Sorry dat het wat lang duurde voordat dit bij me naar boven borrelde.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: kamudieb en 47 gasten