2016-12-10 4 views
3

Lorsque vous utilisez des déclarations de cas Ada chaque cas a automatiquement une pause. En C (ou dans d'autres langages), cette pause n'est pas automatique et tous les cas après le vrai sont exécutés. Est-il possible également d'avoir ce comportement dans Ada ou une solution de contournement?Déclaration de cas Ada se comporter comme en C?

+6

« ou d'autres langues » ... peut-être certaines langues qui attirent « l'inspiration » de C, mais dans les langues que j'appris et l'utilisation , C's fallthrough est vraiment l'homme étrange. Ada suit la tradition (ainsi que les bonnes pratiques) en ne nécessitant pas de pause. –

Répondre

6

Bien sûr, vous pouvez. Mais c'est un comportement si rarement nécessaire qu'il n'y a pas de syntaxe spécifique, donc il vous suffit de le lancer vous-même en utilisant des primitives de bas niveau.

Une approche consiste à utiliser des étiquettes et GOTO, avec la logique de décision de cas proprement séparé de la logique de déclaration ici ..

with Ada.Text_IO; use Ada.Text_IO; 

procedure c_case_example is 

c_case : natural range 1 .. 10 := 1; 

begin 

    case c_case is 
    when 1  => goto case_1; 
    when 3 .. 5 => goto case_3; 
    when 6|8  => goto case_6; 
    when others => goto case_others; 
    end case; 

    <<case_1>>  put_line("Case 1"); 
    <<case_3>>  put_line("Case 3,4,5"); 
        goto break; 
    <<case_6>>  put_line("Case 6,8"); 
    <<case_others>> put_line("all other cases"); 
    <<break>>  null; 

    put_line("Done"); 

end c_case_example; 

Oui il est laid. Si vous voulez programmer C dans Ada, ça va être moche.

10

Il n'y aura jamais de comportement comme ça dans Ada! Le seul moyen raisonnable serait de prendre la section répétée du code, de la mettre dans une procédure (locale) et de l'appeler si nécessaire.

La raison pour laquelle la déclaration de cas d'Ada est comme ceci est que le style C rend trop facile d'oublier les break (en ajoutant /* FALLTHROUGH */ commentaires pour une omission délibérée ne fait pas vraiment le code plus facile à lire - est une omission décommentée une erreur? combien code environnant auriez-vous besoin de lire pour être sûr?).

Dans MISRA C (here, par exemple) règle 15.2 près du bas de la page 60 dit

Une déclaration de rupture inconditionnelle prend fin chaque clause de commutation non-vide.

et Ada, étant destiné à un marché similaire, a pris la même position.

La plupart du temps, plusieurs alternatives pour une action est tout ce qu'il faut:

case K is 
    when 1 | 5 | 10 .. 20 => 
     Action_1; 
    when 3 => 
     Action_2; 
    ... 
end case;