goto
-
Hi Moerchen,
Vorab:
- "nothing happend" ist falsch: Es wurde Speicher angefordert und nicht wieder freigegeben - höchstwahrscheinlich ein Speicherloch erzeugt.
- Ich vermute, die Sprungmarke soll "Exit" heißen und nicht "Keyword" - und die <exp> sind vermutlich auch unterschiedliche.neben den richtigen Verweisen von schauder ist das reine "Entfernen der gotos ganz easy:
void function() { void *memory1 = CreateSomeMemory(); void *memory2 = CreateNextMemory(); void *memory3 = CreateNextMemory(); if(<exp1>) { pass1(memory1); pass2(memory2); pass3(memory3); } else if(<exp2>) { change1(memory1); change2(memory2); change3(memory3); } else { // <- einfach einen letzten Ast Set("Nothing happened"); return; } delete(memory1); delete(memory2); delete(memory3); Set("Ok, memory was passed"); [...] doing some other stuff return; }Es wäre aber auch guter Stil, erst einmal die "pre condition" zu prüfen und nur dann etwas zu tun:
void function() { if(!<exp1> && !<exp2>) { Set("Nothing happened"); return; } void *memory1 = CreateSomeMemory(); void *memory2 = CreateNextMemory(); void *memory3 = CreateNextMemory(); if(<exp>) { //... } else if(<exp>) { //... } delete(memory1); delete(memory2); delete(memory3); Set("Ok, memory was passed"); [...] doing some other stuff return; }(hier wird allerdings tatsächlich im "nothing happend"-Fall kein Speicher angefordert - was mir sehr viel plausibler erscheint.
Das Ganze kann man aber auch noch einfacher/besser/sicherer/wartbarer/.... machen - dazu müsste man aber den konkreten Fall beurteilen.
Weiter solltest Du achten auf:
- Typsicherheitszeug (void?
- das kann aber auch nur Folge der verkürzten Darstellung sein
- Soll wirklich Speicher nicht mehr freigegeben werden nach Ablauf der Funktion? (im Fall von "exp")
- Was soll im Fall on fliegenden exceptions passieren? (-> RAII)Gruß,
Simon2.
-
Simon2 schrieb:
delete(memory1);So wird das aber nichts. Weil delete so eine spezielle "Funktion" ist, braucht sie deutlich mehr Klammern. Zwei sind ja schon ein guter Anfang, aber 4 sind besser und 6 sind endlich professionell.
[cpp] delete(((memory1)));
-
volkard schrieb:
Simon2 schrieb:
delete(memory1);So wird das aber nichts. Weil delete so eine spezielle "Funktion" ist, braucht sie deutlich mehr Klammern. Zwei sind ja schon ein guter Anfang, aber 4 sind besser und 6 sind endlich professionell.
[cpp] delete(((memory1)));das ist doch bloß pseudocode.
-
volkard schrieb:
Simon2 schrieb:
delete(memory1);So wird das aber nichts. ...

merker++ schrieb:
...das ist doch bloß pseudocode.
... und zudem noch kopiert.
@volkard: Wenn Dir sonst nicht mehr aufgefallen ist, bin ich ein wenig enttäuscht von Dir.
Gruß,
Simon2.
-
ist das ein guter ansatz?
ansatz:
#define INTEGER 1 class Pointer { void* cameleon; public: Pointer ( int type, unsigned quantity ) { switch(type) { case INTEGER: cameleon = new int [quantity]; cout << "Created" << endl; break; } } ~Pointer() { cout << "Destroyed" << endl; delete [] cameleon; } }; int main() { Pointer pt(INTEGER, 10); return 0; }
-
delete(((memory1)));Hi! Danke für eure Antworten

Bzgl der oben zitierten delete Anweisung.. Warum brauche ich denn mehrere Klammern? Einfach nur als Konvention oder hat das auch einen technischen Hintergrund?Danke euch

-
Moerchen schrieb:
Bzgl der oben zitierten delete Anweisung.. Warum brauche ich denn mehrere Klammern? Einfach nur als Konvention oder hat das auch einen technischen Hintergrund?
Die sind nötig, damit dein Programm genügend Ironie enthält.
-
Moerchen schrieb:
Bzgl der oben zitierten delete Anweisung.. Warum brauche ich denn mehrere Klammern? Einfach nur als Konvention oder hat das auch einen technischen Hintergrund?
das ist moderator-scherzkeksologie.
mfg
-
Moerchen schrieb:
Hi! Danke für eure Antworten

Bzgl der oben zitierten delete Anweisung.. Warum brauche ich denn mehrere Klammern? Einfach nur als Konvention oder hat das auch einen technischen Hintergrund?volkard, siehst du, was du mit deinem Sarkasmus anrichtest?

Um das klarzustellen: Folgendes ist völlig ausreichend; Klammern sind in diesem Zusammenhang redundant.
delete memory1;
-
Alles klar, ich habe mich schon gewundert ich habe etwas nicht mitbekommen.
Ich hatte daher eher nicht an einen technischen, aber einen syntaktischen Hintergrund erwartet.Ich nehme einfach 9 Klammern :-D.
Danke für eure Hilfe

-
Moerchen schrieb:
Ich nehme einfach 9 Klammern :-D.
delete((((mem1))))/*)*/;
^^