2010-10-02 5 views
0

Je veux tester la transition d'un état à un autre. J'ai défini mes états dans un ENUM comme ceci:comparer un tableau d'enums dans (Objectif) C

enum FingerStatus { 
FINGERS_UP, 
MOVING, 
FINGERS_STILL 
}; 

J'ai un « currentState » et une variable « newState ». Je sais que les enums ne sont que des entiers, et s'ils sont des entiers de 16 bits, ce que je pense qu'ils sont, il est possible de représenter deux énumérations comme un seul entier de 32 bits.

je me sens comme je devrais être en mesure de faire quelque chose le long des lignes de

switch ({currentStatus, newFingerStatus}) { 
    case {FINGERS_STILL, MOVING}: 
     NSLog(@"fingers starting to move"); 
     break; 
    case {MOVING, FINGERS_STILL}: 
     NSLog(@"fingers stopped moving"); 
     break; 
    default: 
     break; 
} 

je réalise la syntaxe est tout faux, mais je pense que l'idée de base est saine. Y a-t-il une autre manière agréable et propre de faire cela?

Répondre

1

Si vous pouvez garantir vos énumérations sont à moins de 16 bits, cela fonctionnera:

switch ((currentStatus<<16) + newFingerStatus) { 
    case (FINGERS_STILL<<16) + MOVING: 
     NSLog(@"fingers starting to move"); 
     break; 
    case (MOVING<<16) + FINGERS_STILL: 
     NSLog(@"fingers stopped moving"); 
     break; 
    default: 
     break; 
} 
+0

Merci! Puis-je garantir qu'ils sont inférieurs à 16 bits en leur attribuant simplement des valeurs pouvant être conservées en 16 bits ou moins? – morgancodes

+0

Oui, si vous leur attribuez des valeurs, elles auront ces valeurs. :-) – xscott

+0

J'aurais dû être plus précis et dire "si les valeurs de vos énumérations peuvent être représentées en moins de 16 bits". – xscott

0

Puisque les commutateurs ne sont qu'une manière élégante d'écrire des gotos, vous ne pouvez pas les utiliser pour faire ce que vous voulez faire. Utilisez plutôt ifs:

if(currentStatus == FINGERS_STILL && newFingerStatus == MOVING) 
{ 
    NSLog(@"fingers starting to move"); 
} 
else if(currentStatus == MOVING && newFingerStatus == FINGERS_STILL) 
{ 
    NSLog(@"fingers stopped moving"); 
} 
0

Ints peuvent être plus 16bits et 32bits généralement sur les ordinateurs (pas sûr à propos de l'iPhone), mais votre idée fonctionne encore.

Vous pouvez utiliser (intOne + (intTwo < < 4)) pour mettre les deux entiers ensemble, pour comparaison et évaluation.

-1

bien pour un, il serait probablement sage de donner les énumérations différentes valeurs uniques: 1,2,4 et non 0 , 1,2 alors vous pouvez bitwise ou eux. Alors vous pouvez faire des étiquettes comme:

case FINGERS_STILL|MOVING: 
Questions connexes