2010-12-09 5 views
0

Das sollte für Sie sehr einfach sein, aber ich kann es immer noch nicht visualisieren. Hier ist, was ich versuche zu tun:Bitte helfen Sie mir mit diesem einfachen, elementaren Pseudocode

if (flag) 
    for (i = 0; i < 10; i++) 
     {LARGE_BLOCK_OF_CODE (that visits an array in order)} 
else 
    for (i = 9; i >= 0; i--) 
     {LARGE_BLOCK_OF_CODE (that visits an array in REVERSE order)} 

Das Problem ist, dass dieser Code-Block nicht in Funktion gesetzt werden kann, und ich will nicht kopieren/einfügen es zweimal. Gibt es einen Weg, wie ich das auf diese Weise machen kann:

if (flag) 
    loop = for (i = 0; i < 10; i++); 
else 
    loop = for (i = 9; i >= 0; i--); 

loop 
{LARGE_BLOCK_OF_CODE (that visits an array in the order specified in 'loop')} 

??

+0

"Dieser Code-Block kann nicht in einer Funktion platziert werden" Warum nicht? –

Antwort

2

Erstellen Sie Variablen für den Anfang und das Ende der Schleife, und erstellen Sie eine dritte Variable, um die 'Richtung' für die Iteration zu bestimmen.

Dann lassen Sie die Schleife einfach durch Ihren EINEN Codeblock laufen. So ...

int iStart = 0; 
int iEnd = 9; 
int iIncrement = +1; 

if (reverse) 
{ 
    iStart = 9; 
    iEnd = 0; 
    iIncrement = -1; 
} 

for (i = iStart; i != iEnd; i += iIncrement) 
{ 
    //...large block of code here... 
} 
+0

Sieht gut aus. Vielen Dank! – SoftwareGuy

+0

Mein Vergnügen, "user486800". :) – Flipster

1

Setzen Sie diesen LARGE_BLOCK_OF_CODE in eine Funktion, die Reihenfolge als Parameter erhalten. Verwende es dann in beliebig vielen Loops.

+0

'Das Problem ist, dass dieser Codeblock nicht in einer Funktion platziert werden kann. – pinichi

+1

Wenn es C oder C++ ist, kann * irgendetwas * in eine Funktion eingefügt werden. Die Frage ist nur, wie viel Arbeit es braucht, um es in eine Funktion zu bringen. Eine andere Alternative: Setzen Sie den LARGE_BLOCK_OF_CODE in ein Makro. –

+1

Das war, was ich zuerst tun wollte, aber ich habe diesen Code anfangs nicht geschrieben, also will ich mich nicht damit anlegen, es sei denn innerhalb der Grenzen, die sie mir zugewiesen haben. Ganz zu schweigen von der Tatsache, dass ich das meiste davon nicht verstehe ...> _> – SoftwareGuy

1

Ich weiß nicht, wie groß Ihr Array ist. Vielleicht ist es möglich, ein zusätzliches Array zu erzeugen, die die erforderlichen Indizes in der gewünschten Reihenfolge gilt:

indexes = [] 

for (i = 0; i < 10; i++) 
    indexes.add(i) 

if (!flag) 
    indexes.reverse() 

for each (i in indexes) 
    {LARGE_BLOCK_OF_CODE} 
+0

Ich mag es. FlipScript's Antwort scheint mir ein bisschen einfacher zu sein, aber das ist ein guter Backup-Plan, wenn der andere nicht für mich funktioniert. Danke für die Einsicht! – SoftwareGuy

+0

Wahr. Mein erster Ansatz war wie FlipScript. Aber er hat mich um 2 Minuten geschlagen, also habe ich das geändert. Wie Sie in seiner Lösung sehen können, ist es etwas schwierig, die Werte für die Endbedingungen richtig zu bekommen. (Ich glaube, beide sind um eins.) Aber am Ende ist es effizienter und intuitiver. Auf der anderen Seite ist die Lösung in meinem Post bereit für einige wirklich funky Loops. Sie könnten das Index-Array sogar mischen und so in zufälliger Reihenfolge durchlaufen. Vielleicht verlinke ich einfach auf diesen Beitrag, wenn jemand das möchte. – Robert

0
for (i = flag?0:9; i != flag?10:0; i += flag?1:-1) 
{ 
//LARGE_BLOCK_OF_CODE 
} 

Nun, ich weiß ...: p das ist zu viele, wenn sonst.

Und ja, FlipScript-Lösung ist besser, obwohl es nicht sauber aussehen könnte. :)

+1

'für (i = 0; i> = 9; i + = 1)' ??? – pinichi

+0

das ist das Ergebnis, wenn Flag = True ^^. Sie müssen '! =' Not '> =' verwenden und '9' durch' 10' ersetzen. – pinichi

+0

Hehe .... sorry mein Schlechter. Danke für das Aufzeigen. – loxxy