Element aus dem Array löschen

july

Erfahrenes Mitglied
hallo,
ich hab folgendes Problem:
ich hab ein sehr großen Array mit Strukturen(von Meldungen). Manchmal entfallen irgendwelche Meldungen und ich muss sie aus dem Array löschen, bzw. einfach die Stelle auf NULLsetzen.
Im Konstruktor hab ich ein Array deklariert
C++:
meldung_t mArr[UINT_MAX];
pmArr = mArr; //pmArr ist ein pointer, der als public in der Klasse deklariert ist

in der Methode
int Test::deleteMessage (int msgid) versuche ich die entsprechende Stelle im Array mit
C++:
*(pmArr+ msgid - 1) = NULL;
freizugeben. und Der Compiler schemisst mir die ganze Zeit folgenden Fehler:

error: no match for 'operator=' in '*(((Meldungsspeicher*)this)->Meldungsspeicher:: pmArr + ((((unsigned int)msgid) + 0xffffffffffffffffu) * 120u)) = 0'

Habt ihr eine Idee wie man das Problem lösen kann?

Grüße July
 
Zuletzt bearbeitet von einem Moderator:
Hi.
hallo,
ich hab folgendes Problem:
ich hab ein sehr großen Array mit Strukturen(von Meldungen). Manchmal entfallen irgendwelche Meldungen und ich muss sie aus dem Array löschen, bzw. einfach die Stelle auf NULLsetzen.
Im Konstruktor hab ich ein Array deklariert
C++:
meldung_t mArr[UINT_MAX];
pmArr = mArr; //pmArr ist ein pointer, der als public in der Klasse deklariert ist
Das wird auf diese Weise keinesfalls funktionieren. Du speicherst die Adresse einer lokalen (automatischen) Variable in einem Attribut deiner Klasse.

Lokale Variablen sind aber nur innerhalb des Blocks gültig in dem sie definiert wurden. Danach wird die Variable und der Speicher automatisch weggeräumt, so dass pmArr letztendlich auf eine Stelle im Stack zeigt wo einmal dein Array gewesen ist. Der Zeiger ist somit nicht mehr gültig nach verlassen des Konstruktors.

Du solltest dynamisch Speicher allozieren:
C++:
pmArr = new meldung_t[MAX_MELDUNGEN];
Und dann im Destruktor wieder freigeben:
C++:
delete[] pmArr;
Außerdem mußt du dann Kopierkonstruktor und Zuweisungsoperator implementieren.

Und meinst du nicht, dass UINT_MAX Elemente etwas zu groß dimensioniert für ein Array ist?
in der Methode
int Test::deleteMessage (int msgid) versuche ich die entsprechende Stelle im Array mit
C++:
*(pmArr+ msgid - 1) = NULL;
freizugeben. und Der Compiler schemisst mir die ganze Zeit folgenden Fehler:

error: no match for 'operator=' in '*(((Meldungsspeicher*)this)->Meldungsspeicher:: pmArr + ((((unsigned int)msgid) + 0xffffffffffffffffu) * 120u)) = 0'

Habt ihr eine Idee wie man das Problem lösen kann?
Dein Array enthält Objekte vom Typ meldung_t und keine Zeiger. Was ist das für ein Typ? Selbstdefiniert? operator= definiert?

Es scheint mir ein Array ist nicht die richtige Datenstruktur für dein Problem. Evlt. solltest du eine std::map verwenden?

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Danke für den Vorschlag, jetzt versuch ich das ganze auf Map umzuschrieben. Aber ich weiß nicht wie man bei einer Map ein Key (Integer) mit nem Wert vergleichen kann um zu überprüfen, ob so ein Key schon vergeben wurde. Hat jemand ne Idee wie man das lösen kann?

Grüße July
 
hab eine schöne Lösung im Internet gefunden.
C++:
while((ilb != melMap.end())&&(ilb->first!=msgId))
{
	ilb++;
	msgId++;
}
 
Zuletzt bearbeitet von einem Moderator:
Zurück