2016-11-10 2 views
0

Also, ich habe dieses Programm, wo ich die Zeilennummer in einer Variablen speichern,Gibt es eine Möglichkeit, zu einer durch eine Variable in C definierten Zeile zu springen?

int x = __LINE__; 

Der Wert von x zu ändern können weiterhin verwenden. Ist es möglich, von einer beliebigen Zeile zu der von x angegebenen zu springen, indem man goto oder irgendein anderes Schlüsselwort in C benutzt? Ich suche nach etwas wie

'keyword' x; 

wo geht das Programm auf eine Linie durch die Variable x definiert.

Gibt es eine Problemumgehung, wenn dies nicht möglich ist?

+0

Ich kann mir nicht vorstellen, warum Sie das jemals tun würden ... – tangrs

+0

Die einzige Möglichkeit, gotos zu berechnen, ist durch 'switch'. –

+6

Das macht in keinem Programm Sinn. Was ist das eigentliche Problem, das Sie versuchen zu lösen? – Lundin

Antwort

7

Der GCC Compiler unterstützt, als eine Erweiterung, using labels as values, so dass Sie mit ihnen in einer Art und Weise arbeiten können, die, was Sie nach ähnelt.

Es erlaubt Ihnen zu tun:

void *ptr = &&label; 
label: 

und dann

goto *ptr; 

zu label springen.

Dies ist normalerweise nützlich im Kern einer virtuellen Maschine und kann natürlich zu schrecklichen Spaghetti führen. Außerdem ist es eine GCC-Erweiterung (auch von Clang unterstützt, denke ich).

+0

Das ist genau das, wonach ich gesucht habe. Ich schrieb ein Programm, um alle Zeilen aus einer Datei zu drucken, beginnend mit der vom Benutzer angegebenen Zeile. Ich weiß, es gibt viel bessere Möglichkeiten, dies zu tun, aber ich hatte nur Spaß. – Sashank

0

Nein, es ist nicht möglich, ein möglicher Weg, etwas Ähnliches zu erreichen, ist eine Variable als Funktionszeiger zu definieren, und sobald Sie die Variable auf eingestellt haben, rufen Sie die richtige Funktion auf.

int foo(int x) { 
    return x+x; 
} 

int (*func) (int); 
func = foo; 
int r = func(3); 
0

Das ist möglich, aber sehr schmerzhaft. Angenommen, Sie haben ein Programm wie folgt aus:

instruction1; 
instruction2; 
... 
instructionn; 

dann können Sie es umschreiben als:

jump: 
switch(x) { 
case 1: 
    instruction1; 
case 2: 
    instruction2; 
... 
case n: 
instructionn; 
} 

Sie dann so etwas wie einfügen können:

jump: 
switch(x) { 
case 1: 
    instruction1; 
case 2: 
    instruction2; 
... 
case <something>: 
    x = <number>; 
    goto jump; 
... 
case n: 
    instructionn; 
} 

Natürlich werden Sie dann einige begegnen Probleme, die Blöcke wie switch in solch einem Schema kodieren, aber es ist immer möglich, es in dieser gegebenen Form zu übersetzen (nicht der Platz hier, um zu erklären, wie). Je nachdem, was Sie wirklich tun müssen, bin ich die Mühe vielleicht nicht wert.

Verwandte Themen