IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Une fonction switch() "inversé" ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Une fonction switch() "inversé" ?
    Bonjour,

    D'habitude un switch est sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    switch(variable)
    {
    case 1:
        instructions;
        break;
    case 2:
        instructions;
        break;
    }
    Mais j'aimerai savoir si il est possible de faire l'inverse, c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    switch(nombre)
    {
    case variable1:
        instructions;
        break;
    case variable2:
        instructions;
        break;
    }
    J'ai déjà essayé ça mais sans succès, donc existe-t-il une autre fonction permettant de faire ça svp ?

    Cordialement,

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Un switch n'est presque qu'une manière simplifiée de tester l'égalité d'une variable à l'une des valeurs d'une liste et de faire des actions en conséquences. Une sorte de if / else if / else condensé. Faire switch(4) n'a donc pas de sens.

    En revanche, ce que tu souhaites faire ne serait pas ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(nombre == variable1) instructions1;
    else if(nombre == variable2) instructions2;
    A noter au passage que switch() n'est pas une fonction. C'est un mot-clé du langage désignant une structure de contrôle, comme while() et for(). C'était l’aparté vocabulaire

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Oui c'est ça que j'aimerai faire.

    Je prend note de l'aparté vocabulaire ^^

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Hello,

    Ce n'est pas possible avec un switch parce que les arguments de case doivent être des entiers constants, d'une part, mais également parce que switch fait un saut directement vers la clause correspondante en fonction du paramètre, quitte à laisser ensuite l'exécution se dérouler jusqu'au bout du bloc en l'absence de directive « break ». Et en particulier, toutes les clauses case doivent avoir un argument différent.

    Le problème, si l'on prend « switch » à l'envers, c'est que tes différentes variables peuvent, elles, être plusieurs à valoir « nombre » et qu'il faut donc toutes les évaluer. Et en plus, il faudrait que le compilateur « saute » les différentes sections qui ne correspondent pas au paramètre, ce qui est contraire à la sémantique de fonctionnement de switch.

    Tu peux t'en sortir, donc, avec des clauses « if ».

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if (variable1==nombre)
    {}
     
    if (variable2==nombre)
    {}
     
    if (variable3==nombre)
    {}

    MAIS, par conséquent, il ne faut pas insérer de « else » entre elles.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    C'est ce que j'ai déjà fais, mais je cherchais un moyen de faire ce "switch inversé" ^^

    Bon bah tant pis si sa n'existe pas mon code va resté comme ça, merci de vos réponses rapides =)

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Salut
    Ce qui n'a pas été dit, c'est qu'un switch est ensuite transformé par le compilo en goto (on remarque d'ailleurs la similitude entre les étiquettes des différents case et le label d'un goto => les deux sont écrits de la même façon, à savoir une string suivi de ":". Ce qui explique aussi qu'on ne puisse pas identifier un case par le biais d'une variable.

    Eventuellement on peu essayer de faire un ersatz de ce que tu demandes en passant par un tableau
    Exemple: on cherche la valeur 4
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    int tab[5]={1, 2, 3, 4, 5};
    int i;
    for (i=0; i < 5 && tab[i] != 4; i++);
    switch (i)
    {
        case 0: // La valeur 4 se trouve sur tab[0]
            // Traitement de tab[0]
            break;
     
        case 1: // La valeur 4 se trouve sur tab[1]
            // Traitement de tab[1]
            break;
     
        case 2: // La valeur 4 se trouve sur tab[2]
            // Traitement de tab[2]
            break;
     
        case 3: // La valeur 4 se trouve sur tab[3]
            // Traitement de tab[3]
            break;
     
        case 4: // La valeur 4 se trouve sur tab[4]
            // Traitement de tab[4]
            break;
     
        default: // La valeur 4 ne se trouve pas dans tab
            // Traitement du cas particulier
    }

    On peut même utiliser des variables i, j, k, l et m en mettant en parallèle ces variables et le tableau dans une union. Ainsi tu accèdes à i ou j ou k mais tu peux aussi passer par tab[x] qui représente la même chose mais qui facilite la recherche. Bon ça marche mais ça reste quand-même bien bancal et peut-être que si t'en es arrivé à ce besoin final c'est que quelque chose a été mal conçu en amont...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] [POO] : faire une fonction quote
    Par gwendoline-bricout dans le forum Langage
    Réponses: 7
    Dernier message: 20/02/2014, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo