Forum: Compiler & IDEs Array terminieren NULL leeren


von Andreas F. (codecasa)


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

von Karl H. (kbuchegg)


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.

von Andreas F. (codecasa)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


Lesenswert?

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!)

von Andreas F. (codecasa)


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
}

von Karl H. (kbuchegg)


Angehängte Dateien:

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
}

von Karl H. (kbuchegg)


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.

von Andreas F. (codecasa)


Lesenswert?

Ja da muss ich dir Recht geben ich will die Tage alles ein bischen 
Verlagern in Headerdateien

Ich probiere das jetzt gleich mal aus Danke vielmals und desweiteren 
werde ich schauen das ich nicht nur Kopiere

von Andreas F. (codecasa)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Andreas F. (codecasa)


Lesenswert?

Ich finde in der cpp überhaupt kein costruktor ?????

Muss ich dann noch die Original Menu.h Includieren ???

von Karl H. (kbuchegg)


Lesenswert?

Andreas Frauenstein schrieb:
> Ich finde in der cpp überhaupt kein costruktor ?????

Der ist inline im Header File

> Muss ich dann noch die Original Menu.h Includieren ???

Natürlich
Sieh dir das Codebeispiel weiter oben an.

von Andreas F. (codecasa)


Lesenswert?

Was bedeutet inline ?

Dann überschreibt mann aber die Original Menu.h oder ?????

von Karl H. (kbuchegg)


Lesenswert?

Andreas Frauenstein schrieb:
> Was bedeutet inline ?

Kauf dir ein C++ Buch
Dringend!

> Dann überschreibt mann aber die Original Menu.h oder ?????

Es ist nach wie vor alles da, was in deiner originalen Menu.h auch war.

von Andreas F. (codecasa)


Lesenswert?

Ja du inludierst in der Main-DATEI :)

Menu.h

damit ist aber nur deine Menu.h gemeint also kann ich die Original 
Menu.h
In ein Müll-Ordner packen ???

von Andreas F. (codecasa)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Andreas Frauenstein schrieb:
>> Was bedeutet inline ?
>
> Kauf dir ein C++ Buch
> Dringend!
>
>> Dann überschreibt mann aber die Original Menu.h oder ?????
>
> Es ist nach wie vor alles da, was in deiner originalen Menu.h auch war.


Achso na dann ist ja Super Tausend Dank

Ich hoffe nur das Ich das mit Array auch hinbekomme

von Andreas F. (codecasa)


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’

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Noch mal nachgesehen.
Das war der
1
#include "WProgram.h"

im originalen Menu.h

von Andreas F. (codecasa)


Lesenswert?

schon okay ich hatte es erst gesehen aber keine beachtung geschenkt wie 
so oft

es war noch
#include "WProgramm"

von Andreas F. (codecasa)


Angehängte Dateien:

Lesenswert?

So läuft klasse aber leider nur Beim ersten aufruf des Menus Item11

wenn ich mit der Backtaste rausgehe un wieder rein Ist alles leer und 
Der AVR reargiert nicht mehr

von Andreas F. (codecasa)


Lesenswert?

Ich denke Will die Item11 noch die &Childs von Iteam11.addChild hat

von Andreas F. (codecasa)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.