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

MATLAB Discussion :

Pas de données de sortie à ma fonction [Débutant]


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Pas de données de sortie à ma fonction
    Bonjour,
    Je suis sur un programme pour traiter des données à l'aide de matlab.

    Le programme marche de la façon suivante :
    - je vais chercher le fichier de mon signal (un fichier csv d'oscilloscope correspondant à un signal de pression)
    - je lance ma fonction me permettant d'effectuer un zoom et de récupérer le xmin et le xmax de ce zoom

    La fonction s’exécute de la façon suivante :
    - je crée une figure avec mon signal,
    - j'affiche mes boutons pour interagir avec le signal
    - j'entre dans la boite de dialogue mon xmin et xmax puis je l’exécute
    - une fois satisfait je ferme la figure et continue mon programme en sauvegardant le xmin et le xmax du zoom.

    Mon problème est là une fois de retour sur le programme qui a exécuté la fonction je ne garde pas le xmin et la xmax dans le workspace. J'ai les valeur lors du premier affichage de la courbe.

    Il est difficile de faire une explication très claire, c'est pourquoi j'ai ajouté le programme et la fonction à la fin de l'explication.

    Merci,


    Voici le programme:
    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
    %% Initialisation, allocation & variables
     
    clear all;
    close all
    format long;
    clc;
    pas = 1000;
     
    %% Ouverture du fichier
     
    [FileName,PathName,FilterIndex] = uigetfile('*csv');
    M = dlmread([PathName,FileName], ',', 7, 3);
    [l,c] = size(M);
    display(sprintf('%s\n%s\n','Fichier csv de pression: ',FileName));
    temps = M(:,1);
    pbrut = M(:,2);
    moyenne = mean(pbrut(1:pas));
    pcorr = pbrut - moyenne;
     
    %% Borne
     
    [xmin, xmax] = GUI_borne(temps,pcorr);
    Voici la fonction:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    function [xmin, xmax] = GUI_borne(temps,pcorr,data, info)
     
    f = figure('Visible','off',...
        'MenuBar','none',...
        'Position',[0, 0, 1200, 800]);
    movegui('center');
    plot(temps,pcorr);
     
    xlabel('Temps (s)','fontsize',12,'fontweight','b');
    ylabel('Pression absolue (bar)','fontsize',12,'fontweight','b');
     
    axis_value = axis;
    xmin = axis_value(1);
    xmax = axis_value(2);
     
    uicontrol('Style', 'text',...
        'String', 'X min :',...
        'Position', [10 110 80 20]);
     
    uicontrol('Style', 'edit',...
        'Tag','xmin',...
        'String', xmin,...
        'Position', [10 90 80 20]);
     
    uicontrol('Style', 'text',...
        'String', 'X max :',...
        'Position', [10 70 80 20]);
     
    uicontrol('Style', 'edit',...
        'Tag','xmax',...
        'String', xmax,...
        'Position', [10 50 80 20]);
     
    uicontrol('Style', 'pushbutton',...
        'String', 'Actualiser',...
        'Tag','actualiser',...
        'Position', [10 30 80 20],...
        'Callback',@pushbutton_Callback);
     
    uicontrol('Style', 'pushbutton',...
        'String', 'OK',...
        'Tag','ok',...
        'Position', [10 10 80 20],...
        'Callback',@pushbutton_Callback);
     
    set(f,'Visible','on');
     
     
        function [xmin, xmax] = pushbutton_Callback(data, info)
     
            switch (true)
     
                case (strcmp(get(gcbo,'Tag'),'actualiser'))
     
                    xmin = str2double(get(findobj(f,'Tag','xmin'),'String'));
                    xmax = str2double(get(findobj(f,'Tag','xmax'),'String'));
                    axis_value = axis;
                    axis_value(1) = xmin;
                    axis_value(2) = xmax;
                    axis([axis_value(1) axis_value(2) axis_value(3) axis_value(4)])
     
     
                case (strcmp(get(gcbo,'Tag'),'ok'))
                    axis_value = axis;
                    axis_value(1) = xmin;
                    axis_value(2) = xmax;
                    close(f);
     
            end
        end
    end

  2. #2
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Salut salut

    Je crois comprendre ce que tu veux faire... seulement, tes variables qui t’intéressent sont définies en (1) et (2) (xmin et xmax), donc les valeurs qui sortiront de ta fonction seront celles-ci puisqu'elles ne sont jamais mises à jour ! Je crois que tu as tenté de le faire en (3) et (4) mais ça ne fonctionnera pas car en faisant ça, tu mets certes à jour tes variables dans ta fonction "GUI_borne", mais en aucun cas tu les renvoies vers ton programme principal ! Ces variables restent finalement "coincées" dans ta fonction "GUI_borne"

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    function [xmin, xmax] = GUI_borne(temps,pcorr,data, info)
    
    f = figure('Visible','off',...
        'MenuBar','none',...
        'Position',[0, 0, 1200, 800]);
    movegui('center');
    plot(temps,pcorr);
    
    xlabel('Temps (s)','fontsize',12,'fontweight','b');
    ylabel('Pression absolue (bar)','fontsize',12,'fontweight','b');
    
    axis_value = axis;
    xmin = axis_value(1);   %(1)
    xmax = axis_value(2);   % (2)
    
    uicontrol('Style', 'text',...
        'String', 'X min :',...
        'Position', [10 110 80 20]);
    
    uicontrol('Style', 'edit',...
        'Tag','xmin',...
        'String', xmin,...
        'Position', [10 90 80 20]);
    
    uicontrol('Style', 'text',...
        'String', 'X max :',...
        'Position', [10 70 80 20]);
    
    uicontrol('Style', 'edit',...
        'Tag','xmax',...
        'String', xmax,...
        'Position', [10 50 80 20]);
    
    uicontrol('Style', 'pushbutton',...
        'String', 'Actualiser',...
        'Tag','actualiser',...
        'Position', [10 30 80 20],...
        'Callback',@pushbutton_Callback);
    
    uicontrol('Style', 'pushbutton',...
        'String', 'OK',...
        'Tag','ok',...
        'Position', [10 10 80 20],...
        'Callback',@pushbutton_Callback);
    
    set(f,'Visible','on');
    
    
        function [xmin, xmax] = pushbutton_Callback(data, info)
    
            switch (true)
    
                case (strcmp(get(gcbo,'Tag'),'actualiser'))
    
                    xmin = str2double(get(findobj(f,'Tag','xmin'),'String'));   % (3)
                    xmax = str2double(get(findobj(f,'Tag','xmax'),'String'));   % (4)
                    axis_value = axis;
                    axis_value(1) = xmin;
                    axis_value(2) = xmax;
                    axis([axis_value(1) axis_value(2) axis_value(3) axis_value(4)])
    
    
                case (strcmp(get(gcbo,'Tag'),'ok'))
                    axis_value = axis;
                    axis_value(1) = xmin;
                    axis_value(2) = xmax;
                    close(f);
    
            end
        end
    end
    Jette un coup d'oeil a la "pseudo-POO", je pense que tu vas aimer... ==> du coup tu peux légèrement repenser ton "GUI-borne" comme une classe qui en sortie t'envoies une structure contenant des paires constituées d'un nom et d'une fonction... donc pour toi tu voudras certainement créer une structure du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    this = struct(...
        'Xmin', @getXmin, ...
        'Xmax', @getXmax);
     
    function out = getXmin(varargin)
        out = Xmin;
    end
    function out = getXmax(varargin)
        out = Xmax;
    end
    Du coup, tu vires Xmin et Xmax des sorties de ta fonction, à la place tu mets ta structure "this" et pour l'appeler de l'extérieur, tu fais :

    mes_bornes = GUI_borne(temps,pcorr);
    Xmin = mes_bornes.Xmin();
    Xmax = mes_bornes.Xmax();

    Tu peux agrémenter ta structure "this" pour recevoir des fonctions/callback que tu déclares dans ta fonction si ça t'arrange etc... bref tu peux imaginer ce que tu veux en fonction de ce que tu as besoin.

    Tu pourras trouver une application un peu naze (car un peu bancal) que j'avais faites dessus : si tu n'as pas la motivation de le lire, laisse tomber ce lien.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tachmou Voir le message
    tu mets certes à jour tes variables dans ta fonction "GUI_borne", mais en aucun cas tu les renvoies vers ton programme principal ! Ces variables restent finalement "coincées" dans ta fonction "GUI_borne"
    Je comprend pas trop le pseudo-POO mais tu a mis le doigt sur mon problème.
    Comment je fais pour que ma variable ne soit pas détruite et les renvoyer dans le programme principale ?
    merci

    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [val] = getR
        val = r;
      end

  4. #4
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Dsl, j'ai updaté mon message précédent, je te laisse lire ^^ et d'ailleurs je vais te laisser cogiter tout ça, je déco dsl ^^ Je répondrai à tes questions demain

    Conseil : essaye de comprendre l'exemple de la calculatrice.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    ok moi aussi je deco, je regarde ca demain matin,

    merci beaucoup, t'es un chef

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Bonsoir,

    si tu fonctionnes par des variables intermédiaires, ca ne marche pas ?

    En t'inspirant d'un truc dans le genre :

    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
    function [xmin xmax] = developpez
     
    u=2;
    v=5;
    [xmin2 xmax2]=test2(u,v);
        function [xmin2 xmax2] = test2(u,v)
     
            xmin2=5*u;
            xmax2=3*v;
        end
     
    xmin=xmin2;
    xmax=xmax2;
     
    end

  7. #7
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    >> Merel : Tant que tu restes dans ta fonction "developpez", les variables min et max sont bien mises à jour à chaque fois que tu fais un appel à ta sous fonction "test2". Par contre, ce qu'il veut faire ici, c'est qu'il appelle sa fonction "developpez" dans son programme principal, et lorsqu'il clique sur un bouton, la sous-fonction "test2" se déclenche et doit mettre à jour ses variables non pas dans "developpez", mais bien dans son programme principal. Et ceci n'est pas possible à moins de faire un appel explicite dans son programme principal à une fonction spécifique qui lui permette de récupérer ses variables.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il manque un simple appel à uiwait(f) à la fin de la fonction GUI_borne.

    Quelques remarques :


    Au final, on aura :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    function [xmin, xmax] = GUI_borne(temps,pcorr,data, info) % data, info utiles ?
     
    f = figure('Visible','off',...
        'MenuBar','none',...
        'Position',[0, 0, 1200, 800]);
    movegui('center');
    plot(temps,pcorr);
     
    xlabel('Temps (s)','fontsize',12,'fontweight','b');
    ylabel('Pression absolue (bar)','fontsize',12,'fontweight','b');
     
    axis_value = axis;
    xmin = axis_value(1);
    xmax = axis_value(2);
     
    uicontrol('Style', 'text',...
        'String', 'X min :',...
        'Position', [10 110 80 20]);
     
    hEditMin = uicontrol('Style', 'edit',...
        'Tag','xmin',...
        'String', xmin,...
        'Position', [10 90 80 20]);
     
    uicontrol('Style', 'text',...
        'String', 'X max :',...
        'Position', [10 70 80 20]);
     
    hEditMax = uicontrol('Style', 'edit',...
        'Tag','xmax',...
        'String', xmax,...
        'Position', [10 50 80 20]);
     
    uicontrol('Style', 'pushbutton',...
        'String', 'Actualiser',...
        'Tag','actualiser',...
        'Position', [10 30 80 20],...
        'Callback',@pushbutton_Callback);
     
    uicontrol('Style', 'pushbutton',...
        'String', 'OK',...
        'Tag','ok',...
        'Position', [10 10 80 20],...
        'Callback','closereq');
     
    set(f,'Visible','on');
     
    uiwait(f)
     
        function pushbutton_Callback(data, info)
     
            xmin = str2double(get(hEditMin,'String'));
            xmax = str2double(get(hEditMax,'String'));
            axis_value = axis;
            axis_value(1) = xmin;
            axis_value(2) = xmax;
            axis(axis_value)
     
        end
    end
    Dernière modification par Invité ; 27/03/2019 à 20h37.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Winjerome tu es trop fort.
    J'ai regardé point par point le problème était le uiwait(f). Si j'ai bien compris le programme principal attend la fin de l’exécution de la figure et donc me donne le temps de cliquer sur les boutons qui me permettent d'enregistrer les valeurs xmin et xmax.

    Un grand merci à toi d'avoir pris la peine de réécrire une grande partie de mon code.

  10. #10
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Je ne connaissais pas ce uiwait. C'est vrai que dans ce cas (fermeture de la fenêtre) c'est ce qu'il te faut, et largement plus simple que ce que je t'ai dit.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par DocDjul Voir le message
    Si j'ai bien compris le programme principal attend la fin de l’exécution de la figure et donc me donne le temps de cliquer sur les boutons qui me permettent d'enregistrer les valeurs xmin et xmax.
    Comme spécifié dans la documentation :
    Citation Envoyé par doc uiwait
    uiwait blocks execution until uiresume is called or the current figure is deleted
    ainsi on attend la fermeture de la figure ou un appel à uiresume (ici un appui sur le bouton OK appelant closereq qui se charge de la fermer) pour exécuter les instructions qui suivent cette ligne (ici seulement sortir de la fonction et renvoyer les valeurs xmin/xmax qui sont rafraichies à chaque appui sur le bouton 'actualiser' et exécution de la fonction pushbutton_Callback associée).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/09/2014, 16h41
  2. Réponses: 17
    Dernier message: 27/02/2014, 10h15
  3. Perte de données en sortie de fonction
    Par sythpen dans le forum C++
    Réponses: 26
    Dernier message: 16/03/2011, 14h22
  4. Pas de données en sortie pour ma table avec sqlserver
    Par Mandrake31 dans le forum Développement
    Réponses: 5
    Dernier message: 06/02/2009, 22h36
  5. Réponses: 6
    Dernier message: 22/05/2008, 11h59

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