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

Interfaces Graphiques Discussion :

Interpréter une chaine de caractères sans eval [Débutant]


Sujet :

Interfaces Graphiques

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Interpréter une chaine de caractères sans eval
    B'jour,

    J'ai une variable issue d'une concaténation de strings, elle contient des matrices et opérateurs. Je souhaiterais réinterpréter cette variable pour la calculer
    (ex : variable = [5]+[2] en faisant variable = eval(variable) je veux trouver 7)
    En ligne de commande ça fonctionne mais pas sur mon programme -_- et j'ai l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ??? Undefined function or method 'eval' for input arguments of type 'cell'.
     
    Error in ==> TailleMatri4>pushbutton3_Callback at 354
    Result = eval(Concate);
     
    Error in ==> gui_mainfcn at 95
            feval(varargin{:});
     
    Error in ==> TailleMatri4 at 17
        gui_mainfcn(gui_State, varargin{:});
     
    ??? Error using ==> TailleMatri4('pushbutton3_Callback',gcbo,[],guidata(gcbo))
    Undefined function or method 'eval' for input arguments of type 'cell'.
     
    ??? Error while evaluating uicontrol Callback
    Je colle le code du bouton qui devrait me permettre d'effectuer le calcul j'espère que cela suffira sinon j'ai toute la première partie du code.

    Code : 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
    29
    30
    31
    32
    % Effectue le(s) calcul(s) inter-matrices
    function pushbutton3_Callback(hObject, eventdata, handles)
    Concate = '';
    NeedParenthese = 0;
     
    % --> Calcul(s)
    %il y a 8 champs de Text dont 4 correspondent aux choix d'opérateurs et 4 aux matrices, si l'utilisateur n'a rien rempli au préalable ces champs sont vides
    for l = 1:1:4
        %récupère le contenu des text dont est servi pour stocker les matrices recomposés et opérateurs
        ObjSelect = findobj(gcf,'Tag',['MatChmps', num2str(l)]);
        Matri = get(ObjSelect, 'String'); %matrice recomposés via des Edit sous la forme [2,5;3,1]
        ObjSelect = findobj(gcf,'Tag',['op', num2str(l)]);
        Operat = get(ObjSelect, 'String'); %opérateur choisi via Popmenu ex : det() ou *
     
            %det et eig sont les opérateurs placés avant les noms des matrices d'où cas spécial pour la concaténation forme : det([Matrice])
            if ((strcmp(Operat, 'eig') == 1) || (strcmp(Operat, 'det') == 1))
                Concate = strcat(Operat, '(', Concate, Matri);
                NeedParenthese = 1;
            else
                %dans tout les autres cas, forme : [Matrice] opérateur [Matrice]
                Concate = strcat(Concate, Operat, Matri);
            end
    end
    if NeedParenthese == 1
        Concate = strcat(Concate, ')');
    end
     
    %Laisse à Matlab le soin de l'opération "^^
    ObjSelect = findobj(gcf,'Tag','ResultatStr');
    set(ObjSelect, 'String', Concate); %résultat concaténer ex: Concate = 'det([1]+[2])'
    Result = eval(Concate); % <= là génération du message d'erreur
    set(ObjSelect, 'String', Result);
    J'arrive pas à m'en dépatouiller sans cette fonction (qui n'a jamais marché qu'une seule fois) que vous bannissez à corps et à cris... Si vous pouviez m'aider ?!

    Merci par avance,

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    En fait MATLAB te dit, avec raison, qu'il ne peut pas évaluer un objet de type Cell.
    Ce qui signifie que variable que tu pensais de type String, s'est transformé en cours de route en type Cell.
    Je te conseillerais donc de regarder comment évolue ta variable Concate pendant ton code.
    A mon avis il y a un des objets que tu concatène à un moment qui est un cell et comme ça ne le dérange pas de concaténer du cell avec du string.
    Pour transformer un type cell en type string : cellstr ou tout simplement si c'est un cell qui est de taille 1*1 et contient une string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C{1} % où C est l'objet cell
    Règles du Forum

    Adepte de la maïeutique

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    -_^ J'adore ! J'ai réussi, encore un grand merci ! Mais sans comprendre....

    J'ai découvert la fonction whos très pratique, alors j'ai tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %Laisse à Matlab le soin de l'opération "^^
    Concate
    whos Concate
    Là ça me renvoie que Concate est de type Char (donc je ne vois pas pourquoi eval ne marchais pas... peu être devrais je me renseigner un peu plus sur la différence str et char)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %Laisse à Matlab le soin de l'opération "^^
    Concate = cellstr(Concate)
    whos Concate
    Là ça me renvoie que Concate est de type Cell (je croyais que cellstr faisait la conversion cell en str pas l'inverse... donc j'ai laissé tomber l'idée du cellstr)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %Laisse à Matlab le soin de l'opération "^^
    ObjSelect = findobj(gcf,'Tag','ResultatStr');
    set(ObjSelect, 'String', Concate); %résultat concaténer
    Result = eval(Concate) % <=plus de message d'erreur
    Result
    whos Result
    Là ça me renvoie que Result = 7 (le bon résultat) et Result est de type double (Eval marchais donc très bien c'est l'affichage qui posait problème..)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %Laisse à Matlab le soin de l'opération "^^
    ObjSelect = findobj(gcf,'Tag','ResultatStr');
    set(ObjSelect, 'String', Concate); %résultat concaténer
    Result = eval(Concate); % <= là génération du message d'erreur
    whos Result
    Result = double2str(Result)
    whos Result
    Là ça me renvoie que le 1er Result est toujours de type double mais le second test rebug avec le message "Undefined function or method 'double2str' for input arguments of type 'double'." (Result, de type double, j'en fais une conversion en string ça plante... pourquoi ?!)


    Alors dans un élan de tests foireux je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %Laisse à Matlab le soin de l'opération "^^
    ObjSelect = findobj(gcf,'Tag','ResultatStr');
    set(ObjSelect, 'String', Concate); %résultat concaténer ex: Concate = 'det([1]+[2])'
    Result = eval(Concate); %  <=plus de message d'erreur
    whos Result
    Result = num2str(Result)
    whos Result
    Là ça me renvoie que le 1er Result est double, et le second Result est char (pourquoi num2str et pas double2str ?). Ca marche parfaitement je n'es plus eu qu'à faire une conversion num2str pour avoir mon résultat dans mon Text.
    Plus besoin que de comprendre ^^


    EDIT : Toute cette partie qui faisait le calcul je l'avais mis dans un bouton à part, j'ai recopié le code dans le bouton principal et la en testant 'Concate' il me dit qu'il est de type cell pas char... (et cellstr me converti mon type cell en cell ...)
    Suis perdu, pourquoi en copiant collant le code dans un autre bouton ma variable à changer comme ça de type.... (ps: ce nom 'Concate' ne sert bien que dans ce bout de programme)

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Désolée pour le cellstr, comme quoi il ne faut pas répondre quand on est trop fatigué. Ca transforme effectivement une string en cell.
    Ceci dit il y avait quand même un indice dans ma réponse fausse (je me raccroche aux branches ). Dans l'aide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use the <a href="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/char.html" target="_blank">char</a> function to convert back to a string matrix.
    Donc c'est char qu'il faut utiliser...

    Pour le reste
    Différence char et string : en fait une string est un tableau de char.

    double2str ne fonctionne pas : cette fonction n'existe pas tout simplement.str2double oui car tu veux lui donner la précision d'arrivé mais dans l'autre sens tu veux juste transformer un numérique en string.

    Et je ne suis pas sure que ce soit le fait de copier-coller ton code qui ai changé quelque chose.
    Au début tu disais que tes calculs pouvaient être faits sur des matrices. si tu les rentres sur plusieurs lignes alors le problème peut venir de là.
    Règles du Forum

    Adepte de la maïeutique

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci -_- ...

    Ben oui ça n'existe pas double2str, ça me paraissait tellement intuitif il met jamais venu à l'idée de vérifier, désolé! Si seulement le compilateur m'avais averti
    Pour cellstring oui j'était allez voir l'help de Matlab (c'est même là que j'ai appris la fonction whos) mais j'avais compris cette phrase à l'envers (English power !)

    Pour ma variable qui était passer de char à cell en fait c'est parce que pendant les tests pour m'eviter de rentrer une matrice, choisir l'opérateur... j'avais pré-rempli les Text pour le calcul. Hors quand je le rentre à la main une matrice elle est considérer comme char et quand c'est issue de ma fonction c'est bien un type Cell. Maintenant le message d'erreur prend tout son sens. Un petit char(Concate) et c'était bon
    doublement réussi ^_^

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/02/2013, 23h52
  2. Réponses: 5
    Dernier message: 13/03/2012, 10h52
  3. Séparer une chaine de caractères sans split
    Par ndsaerith dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 24/05/2011, 16h05
  4. Interpréter une chaine de caractères
    Par carnifex dans le forum Struts 1
    Réponses: 2
    Dernier message: 07/01/2009, 00h36
  5. Réponses: 2
    Dernier message: 14/11/2007, 09h56

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