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

Contribuez Discussion :

[Défis][6] Le coté obscur de EVAL


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut [Défis][6] Le coté obscur de EVAL


    Voici deux lignes de code MATLAB que vous pouvez exécuter sans aucun risque, faites moi confiance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    str = 'eval(sprintf(''%c'',99,108,99)),eval([''f'' 112 114 105 110 116 102 40 39 37 99 39 44 91 56 32 49 48 32 49 48 32 49 48 32 49 48 32 53 32 57 32 49 48 32 49 48 32 49 48 32 49 48 93 46 94 50 43 91 56 32 49 32 56 32 56 32 49 49 32 55 32 54 32 49 49 32 49 52 32 56 32 48 93 44 114 101 112 109 97 116 40 56 44 49 44 49 49 41 41]);';
     
    eval(str)
    Les plus perspicaces d'entre vous se rendront compte que ce code ne fait... rien
    Ou du moins qu'il ne semble rien faire, et pourtant ce code effectue bien 3 actions distinctes

    Saurez-vous trouver ce que font les 3 actions cachées dans ce code

    ---------------------------------------------------

    Pour permettre à tout le monde de participer, soumettez-moi vos réponses par MP, je donnerai dans cette discussion la liste des membres ayant la bonne réponse.

    ---------------------------------------------------

    A votre logique et à vos claviers !
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Liste des membres ayant trouvé la bonne réponse



    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Voici la réponse

    -------------------------

    La fonction EVAL exécute l'action qui lui est passée sous forme de chaînes de caractères.

    Ici, la chaine de caractères str contient elle-même deux appels à EVAL dont les contenus sont codés.

    La première chaine de caractères est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'eval(sprintf(''%c'',99,108,99))'
    La commande à évaluer est donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(sprintf('%c',99,108,99))
    Donc un appel à SPRINTF pour afficher des caractères (argument '%c') codés en valeurs numériques.

    Dans ce cas, MATLAB utilise la table ASCII pour faire la conversion "nombre" => "caractère"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> sprintf('%c',99,108,99)
     
    ans =
     
    clc
    Ce premier morceau de code est donc équivalent à :
    La première commande fait donc appel à la fonction CLC qui a pour but de nettoyer le Command Window de MATLAB.

    En suivant le même raisonnement pour le second appel à EVAL, on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(['f' 112 114 105 110 116 102 40 39 37 99 39 44 91 56 32 49 48 32 49 48 32 49 48 32 49 48 32 53 32 57 32 49 48 32 49 48 32 49 48 32 49 48 93 46 94 50 43 91 56 32 49 32 56 32 56 32 49 49 32 55 32 54 32 49 49 32 49 52 32 56 32 48 93 44 114 101 112 109 97 116 40 56 44 49 44 49 49 41 41])
    Dans ce cas, la chaîne de caractères codée donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> ['f' 112 114 105 110 116 102 40 39 37 99 39 44 91 56 32 49 48 32 49 48 32 49 48 32 49 48 32 53 32 57 32 49 48 32 49 48 32 49 48 32 49 48 93 46 94 50 43 91 56 32 49 32 56 32 56 32 49 49 32 55 32 54 32 49 49 32 49 52 32 56 32 48 93 44 114 101 112 109 97 116 40 56 44 49 44 49 49 41 41]
     
    ans =
     
    fprintf('%c',[8 10 10 10 10 5 9 10 10 10 10].^2+[8 1 8 8 11 7 6 11 14 8 0],repmat(8,1,11))
    La première chaîne de caractères donne en valeurs numériques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> [8 10 10 10 10 5 9 10 10 10 10].^2+[8 1 8 8 11 7 6 11 14 8 0]
     
    ans =
     
        72   101   108   108   111    32    87   111   114   108   100
    soit après conversion en chaîne de caractères par rapport à la table ASCII (avec CHAR par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> char([72 101 108 108 111 32  87 111 114 108 100])
     
    ans =
     
    Hello World
    FPRINTF affiche donc le fameux "Hello World" dans le Command Window

    La seconde chaine de caractère donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> repmat(8,1,11)
     
    ans =
     
         8     8     8     8     8     8     8     8     8     8     8
    En se référant à la table ASCII, on voit que la valeur 8 correspond au caractère Backspace qui efface le caractère qui le précède.
    FPRINTF efface donc les 11 derniers caractères qu'il vient d'afficher.

    Comme la chaîne "Hello World" fait exactement 11 caractères, elle est effacée !

    -------------------------

    Donc, pour résumer :

    1) Nettoyage du Command Window avec CLC
    2) Affichage de "Hello World" avec FPRINTF
    3) Effacement de "Hello World" grâce au caractère Backspace

    Donc au final, l'utilisateur à l'impression que le code ne fait rien, ce qui est faux.

    -------------------------

    Ce défi permet de mettre en évidence le coté peu lisible d'un code qui utilise EVAL.
    Il est toujours préférable de trouver des alternatives à son utilisation.
    => Comment créer des variables nommées A1, A2, A3, ..., AN ?

    D'autre part, la technique du backspace vous permet de créer un compteur rapide et compact dans le Command Window.
    Ceci peut être une alternative efficace à la fonction WAITBAR
    => Afficher une barre de progression de l’exécution

    -------------------------

    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. Somme totale... Défi !
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 04/08/2005, 21h03
  2. Icône a coté du texte dans une ListBox
    Par joce3000 dans le forum C++Builder
    Réponses: 6
    Dernier message: 05/12/2003, 02h25
  3. [Concept] Curseur coté client et curseur coté serveur
    Par freud dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 13/09/2002, 22h13
  4. [Choix] SGDB pour Entreprise : coût, efficacité, etc.
    Par grassat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 15/06/2002, 08h52

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