Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

61

11.01.2012, 21:21

Allerdings ist es durchaus sinnvoll goto in eine Sprache einzubauen, weil es tatsächlich einige Situationen gibt, wo goto am Leserlichsten und Sinnvollsten ist.

Ja es kann sinnvoll sein, beispielsweise in einer Sprache wie C, wo man mit einem goto einfach und ohne Codeduplizierung eventuelle Aufräumarbeiten vornehmen kann(auch im Fehlerfall). In einer Sprache, die einen Garabage-Collector besitzt, sehe ich allerdings den Sinn von goto eher weniger. Java hat ja mit Namen versehene Schleifen, die man dann mit einem break gezielt abbrechen kann, so etwas ist manchmal auch ganz hilfreich, aber andere Einsatzzwecke für goto sehe ich keine. Und da bevorzuge ich dann doch die Variante, die Java gewählt hat, goto einfach weg zu lassen, weil es eben wirklich nicht gebracht wird und im Zweifelsfall nur falsch verwendet wird.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

62

11.01.2012, 21:22

Fehler dürften entweder mit einem Try ... Catch oder einer Abfrage abgefangen/überprüft werden
somit ist ein Springen mittels Goto unnötig, da sich der Fehlerbehandlungscode im else-Zweig oder oder im catch-Block befinden dürfte

anderes Beispiel?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

63

11.01.2012, 21:29

Beispiel bitte.

MfG
Check

Es gibt Situationen, wo man speichern möchte wo eine Funktion gerade ausgeführt wird (also praktisch den Instructionpointer). Ich habe zB mal eine Art Spiel geschrieben, wo es zu jedem Zeitpunkt eine Reihe von Spielzuständen gibt und sich bei diversen Spielentscheidungen ein Spielzustand für jede Möglichkeit aufspaltet (so ne Art fork()). Da sich der Spielzustand auch während der Ausführung einer Funktion, die den Spielzustand verändert, forken lässt, ließe sich sowas ohne gotos nur sehr hässlich implementieren...
Ein ähnliches, nicht ganz so abgehobenes, Beispiel sind die Implementation von Iteratoren in C#.

Anfängern kann man natürlich immer noch sagen, dass sie kein goto verwenden dürfen, aber es aus der Sprache zu verbannen ist sicher wenig sinnvoll.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

64

11.01.2012, 22:13

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if(blub)
 goto t1:

if(bla)
{
 int x=5
 t1:
 cout << x;
 goto t2;
}
t2:
if(UserInput==Nochmal)
 goto t1;

Wie kann bei sowas entschieden werden, wann eine Variable angelegt und wann zerstört wird? Zur Compilezeit kann es unmöglich entschieden werden, und es wird wohl kaum zur Laufzeit Buch geführt, ob eine Variable noch schnell initialisiert werden muss oder ob sie jetzt eben zerstört werden kann.

Wird das alles einfach ignoriert und es wird ein ganz stupider Sprung ausgeführt? Aber wie passt das zu einer Sprache wie C++, man man sich in so vielen Fällen darauf verlässt, dass Destruktoren wirklich aufgerufen werden?
Lieber dumm fragen, als dumm bleiben!

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

65

11.01.2012, 22:20

schlechtes beispiel, auch hier braucht man kein goto:

C-/C++-Quelltext

1
2
3
4
5
6
7
do {
  if(bla) {
    if(!blub)
      x = 5; // x wird irgendwo ausserhalb definiert, wo es nicht gleich wieder gelöscht wird und der wert erhalten bleibt
    cout << x;
  }
} while(UserInput==Nochmal);


das hauptproblem beim obigen beispiel ist, wie von jonathan schon erwähnt, dass man keine ahnung hat, welchen zustand X hat. was passiert, wenn blub=true ist, aber zuvor noch nie false war? in dem fall würde der code auf X zugreifen (zeile 8), X wäre jedoch noch nie initialisiert worden

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

66

11.01.2012, 22:28

@Jonathan_Klein
Wenn die Initialisierung übersprungen wird findet sie auch nicht statt, der Wert von dem Integer ist also undefiniert und der Compiler gibt deshalb normalerweise eine Warnung aus. Wenn der Typ einen Konstruktor hat gibt es einen Compiletimeerror, wenn die Initialisierung übersprungen wird.

@DasBlub
Ich glaube sein Beispiel sollte nicht pro-goto sein ;)
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

67

11.01.2012, 22:34

Wie mache ich aus einer Methode eine Statische Funktion ?

// Das ist die antwort:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class xxx
{
public:
    void test() { cout << "Hallo"; }
};

typedef void (xxx::*func)();




template<typename T>
void* GetPointer(T p)
{           
    union{
        T               in;
        void*           out;
    }help;

    help.in = p;
    return help.out;
}


int main(int argn, char** argv)
{
    func f = &xxx::test;

    void (*ptr)() = *((void (**)())(&f));
    //oder
    void (*ptr)() = (void (*)())GetPointer(f);

    ptr();
    

    cin.get();

    return 0;
}


Ein hoch auf C++

68

11.01.2012, 22:42

Respekt. :thumbsup:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

69

14.03.2012, 16:50

Aktuelle Projektarbeit, Code meines Mitstudenten...

C-/C++-Quelltext

1
2
3
4
    //Anzahl aller möglichen Züge !DONE!
    int berechneAnzahlZuege(std::vector<Zug> &PossibleZuege) {
        return PossibleZuege.size();
    }


und

C-/C++-Quelltext

1
2
3
4
std::vector<Spielsteine> foo;
// .. foo befüllen
std::vector<string> str = dynamic_cast<std::string>(foo);
// String an den Server senden
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

70

14.03.2012, 16:54

Autsch! Das tut ja richtig weh :thumbdown:

Werbeanzeige