2016-11-04 3 views
6

Ich weiß, dass dies bereits diskutiert wurde, und es gibt mehrere Antworten darauf. Siehe zum Beispiel Performance of array of functions over if and switch statements, aber ich würde gerne einige andere Ideen bekommen.Bessere Alternativen für Switch-Anweisungen

Ich habe eine Funktion mit einer großen switch Aussage. Dies ist 26 case und jeweils mit einer left oder right Option. Diese Funktion gibt einen Zeiger auf zwei gegebene Parameter (plane und direction):

double* getPointer(int plane, int direction) { 
    switch (plane) 
    { 
    case 0: 
    if (direction == 0) 
     return p_YZ_L; // Left 
    else if (dir == 1) 
     return p_YZ_R; //Right 
    else { 
     return 0; 
    } 

    break; 
    ... 
    case 25: 
    ... 
    } 
} 

mit

planes -> [0-25] 
direction -> [0,1] 

Ich habe auf einer Reihe von Funktionen gedacht, aber auch langweilig sein könnte, und ich bin nicht sicher, ob es die beste Option ist. Mir ist auch nicht klar, wie ich es richtig machen soll. Irgendwelche Ideen?

+3

Bitte zeigen Sie den Code mit den'Switch'-Anweisungen, über die Sie sprechen. –

+0

Zwei Funktionen mit 26 Switch-Fällen können eine gute Alternative sein, wenn angenommen wird, dass rechte und linke Sub-Cases nicht viel Code gemeinsam haben. – dasblinkenlight

+5

Wie wäre es mit Array 'double * x [2] [26]' und 'return x [direction] [plane]'? –

Antwort

9

Sie können eine Lookup-Tabelle wie folgt erstellen:

double *pointers[26][2] = { 
    { p_YZ_L, p_YZ_R }, 
    ... 
}; 

Dann ist Ihre Funktion wird viel einfacher:

double* getPointer(int plane, int direction) { 
    if ((plane >= 0) && (plane < 26) && (direction >= 0) && (direction < 2)) { 
     return pointers[plane][direction]; 
    } else { 
     return NULL; 
    } 
} 
+0

@_dbush Sollte das nicht "direction <2" sein? – Manolete

+0

@Manolete Ja sollte es. Bearbeitet. – dbush

1

Sie können mit einem Iterator zu verwenden, während Sie wie folgt vor:

double* getPointer(int plane, int direction){ 
    int i=0; 
    while (i<26){ 
    if (plane == i){ 
     if (direction == 0) 
      return p_YZ_L; //Left 
     else if(dir==1) 
      return p_YZ_R; //Right 
     else 
      return 0; 
    } 
    i++; 
    } 
} 

Es ist nicht optimiert ist, aber es ist weniger Code in Bezug auf Ihre Version.

+0

@_resh Ich stimme zu, es ist weniger Code, aber nicht das, was ich bin – Manolete

3

Wenn Sie einfach nur müde von der Eingabe sind, können yu den Präprozessor verwenden, zB:

#define PLZ(dir) if(!dir)return(p_YZ_L);else if(dir==1)return(p_YZ_R);else return 0; 
2

Nicht ganz sicher, aber vielleicht wollen Sie dies:

struct 
{ 
    double dir[2]; 
} directions[26] = 
{ 
    { p_YZ_L, p_YZ_R}, 
    { ..., ... },   // 25 pairs of options here 
    ...    
}; 

double* getPointer(int plane, int direction) { 
    return &directions[plane].dir[direction]; 
} 

Weitere Tests müssen hinzugefügt werden, um sicherzustellen, dass plane und direction innerhalb der erforderlichen Grenzen liegen.