Array terminieren NULL leeren

OP #2724389
Lesenswert?

Hallo

Wie kann man eine Array z.B der Classe Menu also Menu plapla[20] leeren
zurücksetzen so das mann Sie wieder befüllen kann ?

hier mal der Code:
1
    Menu    mnuProg[20];
2
    uint8_t usedMnu = 0;
3
            
4
Menu* allocateMenu()
5
{
6
  if( usedMnu >= 20 ) return NULL;        
7
  return &mnuProg[usedMnu++];
8
}
9

10

11
void mnuAddCMD(char *n)
12
{
13
  Menu* newMenu = allocateMenu();
14

15
  if( newMenu == NULL )  
16
  {
17
    // da ist wohl was schief gelaufen
18
    Serial.println("newMenu = NULL");
19
    return;
20
  }
21
  
22
  newMenu->name = n;
23
  
24

25
  Item11.addChild(*newMenu);
26
}


Ich will praktich wieder neue Menüs erstellen Ohne noch mehr Speicher zu 
verbrauchen
#2724433
Lesenswert?

Andreas Frauenstein schrieb:

> Menu* allocateMenu()
> {
>   if( usedMnu >= 20 ) return NULL;
>   return &mnuProg[usedMnu++];
> }

Das hier rückt genau ein Array Element nach dem nächsten raus.
Wenn du also ein Element zurückgeben willst, dann muss es das letzte 
sein. Mehr geht mit dieser Verwaltung erst mal nicht. (dafür ist sie 
allerdings einfach)
   usedMnu--;


Wenn du natürlich alle zurückgeben willst, dann reicht ein
   usedMnd = 0;

und das Array wird komplett recycled.
OP #2724438
Lesenswert?

Karl Heinz Buchegger schrieb:
> Andreas Frauenstein schrieb:
>
>> Menu* allocateMenu()
>> {
>>   if( usedMnu >= 20 ) return NULL;
>>   return &mnuProg[usedMnu++];
>> }
>
> Das hier rückt genau ein Array Element nach dem nächsten raus.
> Wenn du also ein Element zurückgeben willst, dann muss es das letzte
> sein. Mehr geht mit dieser Verwaltung erst mal nicht. (dafür ist sie
> allerdings einfach)
>
> Wenn du natürlich alle zurückgeben willst, dann reicht ein
>    usedMnd = 0;
>
> und das Array wird komplett recycled.

Ja Dachte ich mir auch
usedMnd = 0;

Aber der Zeigt mir danach im Menü komische Zeichen an :(
Kopletter code im Anhang
Angehängte Dateien:
OP #2724464
Lesenswert?

Karl Heinz Buchegger schrieb:
> Andreas Frauenstein schrieb:
>
>
>>> Wenn du natürlich alle zurückgeben willst, dann reicht ein
>>>    usedMnd = 0;
>>>
>>> und das Array wird komplett recycled.
>>
>> Ja Dachte ich mir auch
>> usedMnd = 0;
>>
>> Aber der Zeigt mir danach im Menü komische Zeichen an :(
>
> Weil die hälfte deiner Pointer in den Menu Objekten nicht NULL sind.
> (In der Allocate Funktion auf NULL setzen!)


etwa so ?
1
Menu* allocateMenu()
2
{
3
  if( usedMnu >= 20 ) return NULL;        
4
  return &mnuProg[usedMnu++];
5
  mnuProg[usedMnu - 1] = NULL;
6
}
#2724500
Lesenswert?

Eigentlich sollte ich das ja nicht tun.
Denn eigentlich solltest du erst mal die Sprache lernen, die du benutzt 
und auch einfache Algorithmen.

Aber hier hast du einen gepimpten einfachen MenuManager (ich kann da 
nicht länger zuschauen)

Er wird so verwendet
1
#include "Menu.h"
2

3
MenuManager pool;
4

5
int main()
6
{
7
  Menu* m1 = pool.Allocate();    // einen allokieren
8
  Menu* m2 = pool.Allocate();    // noch einen allokieren
9

10
  pool.Free( m1 );               // der wird nicht mehr gebraucht: zurückgeben
11

12
  pool.Reset();                  // ach was solls: ich gebe alle zurück
13

14
  m1 = pool.Allocate();          // denn dann kann wieder neu allokiert werden
15
  m2 = pool.Allocate();          // so viele, bis keine mehr da sind.
16

17

18
  return 0;
19
}
Angehängte Dateien:
#2724503
Lesenswert?

Andreas Frauenstein schrieb:

> etwa so ?
>
1
> Menu* allocateMenu()
2
> {
3
>   if( usedMnu >= 20 ) return NULL;
4
>   return &mnuProg[usedMnu++];
5
>   mnuProg[usedMnu - 1] = NULL;
6
> }
7
> 
8
>

denk nachmal ganz scharf nach.
Wird Code NACH einem return jemals ausgeführt?

Du solltest DRINGEND an deinem Coding Style arbeiten. Der ist 
unübersichtlich bis zum geht nicht mehr. Das du da nichts siehst wundert 
mich nicht.
#2724521
Lesenswert?

Andreas Frauenstein schrieb:
> Oh ich denke Ich bekomme noch mehr Probleme wenn ich statt nur die
> dynamichen auch die Statischen mit der neuen Menu classe initialisiere.

Sagt kein Mensch, das du das musst.
Der MenuManager verwaltet einen Pool von 20 Menu Objekten. Auf 
Anforderung rückt er eines raus (wenn noch eines da ist) oder nimmt 
wieder eines unter seine Fittiche, wenn du es nicht mehr brauchst.
OP #2724565
Lesenswert?

/usr/share/arduino/libraries/Menu/Menu.h:15:17: error: ISO C++ forbids 
declaration of ‘boolean’ with no type
/usr/share/arduino/libraries/Menu/Menu.h:15:17: error: typedef ‘boolean’ 
is initialized (use decltype instead)
/usr/share/arduino/libraries/Menu/Menu.h:15:19: error: ‘canFunction’ was 
not declared in this scope
/usr/share/arduino/libraries/Menu/Menu.h:22:24: error: ‘canFunction’ has 
not been declared
/usr/share/arduino/libraries/Menu/Menu.h:38:3: error: ‘canFunction’ does 
not name a type
/usr/share/arduino/libraries/Menu/Menu.h: In constructor 
‘Menu::Menu(char*, int)’:
/usr/share/arduino/libraries/Menu/Menu.h:27:5: error: class ‘Menu’ does 
not have any field named ‘canEnter’
#2724586
Lesenswert?

Andreas Frauenstein schrieb:
> /usr/share/arduino/libraries/Menu/Menu.h:15:17: error: ISO C++ forbids
> declaration of ‘boolean’ with no type

Ach ich vergass.
In deiner originalen war ein #include für ein Header File, von dem ich 
nicht weiß wo es herkommt bzw. was da drinnen ist.
Da dürfte der typedef für boolean drinnen gewesen sein.

Ansonsten mach ein

typedef unsigned char boolean;

ins Header File oben rein.
OP #2724637
Lesenswert?

Habs  :)

Menu.h ausschnitt
1
public:
2
  Menu(char *n = NULL, canFunction c = NULL )
3
  : parent( NULL ),
4
    child( NULL ),
5
    sibling( NULL ),
6
    name( n ),
7
    canEnter( c )
8
  {}
9

10
  void addChild(Menu &c);                //Adds the child c to the Menu.
11
                                         //If the menu already has a child, ask the child to add it as a sibling
12
  void lreset(); <<<<<<-------

Menu.cpp ausschnitt
1
void Menu::reset()
2
{
3
  parent   = NULL;
4
  child    = NULL;
5
  sibling  = NULL;
6
  name     = NULL;
7
  canEnter = NULL;
8
}
9

10
void Menu::lreset()
11
{
12
  child    = NULL;
13
  sibling  = NULL;
14
}
15
//*****************************


Und in der Haupdatei:
1
Item11.lreset(); // damit wird die Adresse von Child, Sibling und somit all anderen kinder entfernt

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren