2009-12-26 19 views
-1

Comment écrire cela sans goto:Transférer une variable à un point earier sans goto

ob_start(); 
$a = 0; 
echo "START of LEFT<br />"; 
begin: 
    if($a > 0) { 
     echo "CONTENT LEFT: $a<BR />"; 
     <VERY DIFFICULT ALGORHITM> 
     goto end; 
    } 
<... ALL THE REST CODE OF LEFT ...> 
echo "END of LEFT<br /><br />"; 
$output1 = ob_get_contents(); 
ob_end_clean(); 

ob_start();  
echo "START of CENTER<br />"; 
$a = 5; goto begin; 
end: 
    <... ALL THE REST CODE OF CENTER ...> 
    echo "END of CENTER<br />"; 
    $output2 = ob_get_contents(); 
    ob_end_clean(); 
    // print it 
    echo $output1.$output2; 

Pour obtenir cet écho:

START of LEFT 
CONTENT LEFT: 5 
END of LEFT 

START of CENTER 
END of CENTER 

Exigences:

1. Je ne suis pas autorisé à changer la commande (CORE (echo $ a), et PLUGIN ($ a = 5)):

ob_start(); 
$a = 0; 
<ANY CODE> 
echo $a; 
$output1 = ob_get_contents(); 
ob_end_clean(); 

ob_start(); 
<ANY CODE> 
$a = rand(0,10); 
$output2 = ob_get_contents(); 
ob_end_clean(); 

2. de sortie doit être générée via ob_get_contents();

Mais je suis autorisé à écrire n'importe quel code dans des endroits.

// Solvings ob_get_contents(); Aide seulement si vous voulez remplacer quelques lignes dans la sortie HTML CODE, mais ne peut pas changer une valeur de la variable, pour changer l'ALGORHYTM (dépend de la valeur var), qui génère le code HTML aléatoire.

En outre, Comme je l'ai vérifié mon code, je comprends que mon code, même avec GOTO étiquettes déclaration, NE PAS va changer le contenu output1 $?. Comment faire ça? Est le seul moyen est de recache le $ output1 de son début. Ou peut-être que je suis capable de le faire d'autres façons?

+2

Ce code me rend très, très triste. –

+0

moi aussi. Je suis un peu confus, vous semblez avoir posé les mêmes questions il y a un instant. Pas si cool. – moritz

+0

Pas vraiment la même, similaire, pas la même, l'autre était source entière inc. motif de conception connexe. Celui-ci est spécifié dans un sujet - transfert de variable sans goto. – KestutisIT

Répondre

1

Vous connaissez le concept de méthodes/fonctions? Si non (et il semble que les chances sont ..), vous devriez vraiment apprendre quelque chose à propos de ces premiers. C'est alors un jeu d'enfant de diviser la fonctionnalité d'un bloc de code monolithique en petits morceaux de code maintenables.

0

Si je comprends bien ce que vous voulez faire j'utiliser des fonctions récursives au lieu de goto. par exemple regarde cet analyseur d'expression mathématique que j'ai Witten en C il y a quelque temps:

#include <cstdio> 

const long MAX = 100010; 
char S[MAX], *p=S; 

long eval(); 
long termen(); 
long factor(); 


int main() { 
    FILE *fin=fopen("evaluare.in", "r"); 
    FILE *fout=fopen("evaluare.out", "w"); 

    fgets(S, MAX, fin); 
    fprintf(fout, "%ld\n", eval()); 
    return 0; 
} 

long eval() { 
    long r = termen(); 
    while (*p=='+' || *p=='-') { 
     switch (*p) { 
      case '+': 
       ++p;      // go over "+" 
       r += termen(); 
       break; 
      case '-': 
       ++p;      // go over "-" 
       r -= termen(); 
       break; 
     } 
    } 
    return r; 
} 

long termen() { 
    long r = factor(); 
    while (*p=='*' || *p=='/') { 
     switch (*p) { 
      case '*' : 
       ++p; 
       r *= factor(); 
       break; 
      case '/': 
       ++p; 
       r /= factor(); 
       break; 
     } 
    } 
    return r; 
} 

long factor() { 
    long r=0; 
    if (*p == '(') {      // subexpression 
     ++p;        // go over '(' 
     r = eval(); 
     ++p;        // go over ')' 
    } else { 
     while (*p>='0' && *p<='9') {  // number 
      r = r*10 + *p - '0'; 
      ++p; 
     } 
    } 
    return r; 
} 

L'idée principale est de diviser le code en fonctions et de dire où vous avez laissé:

goto apocalypse 

vous 'll aura:

Apocalypse(); 

C'est la longue histoire dite courte.