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 :

nargout et set


Sujet :

MATLAB

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut nargout et set
    Bonjour,

    Pourquoi la builtin set() fait elle apparaître un output ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    which set %-> built-in (...\toolbox\matlab\graphics\set)
    nargout(@set) % -> 1
    zz=set(h(1),'facecolor','g')% -> Error using set One or more output arguments not assigned during call to "set".

  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 : 52 882
    Points
    52 882
    Par défaut
    Parce que set permet également de lister les valeurs possibles d'une propriété :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >> p = patch(...);
    >> set(p,'facecolor')
    [ none | flat | interp ] -or- {a ColorSpec}.
    >> a = set(p,'facecolor')
     
    a = 
     
        'none'
        'flat'
        'interp'
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> set(p,'facecolor','g')
    >> a = set(p,'facecolor','g')
    One or more output arguments not assigned during call to "set".
    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
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Effectivement, mais dans le cas d'une fonction retournant un nombre variable d'outputs, je m'attends à nargout(@set)= -1

    doc nargout
    If the function includes varargout in its definition, then nargout returns the negative of the number of outputs.
    Cela sous entends que set à un nombre variables d'outputs, mais implémenté sans varargout !

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    en fait il y a 1 seul argument de sortie qui est varargout
    issu de l'aide de nargout

    nargout(fx) returns the number of outputs that appear in the definition statement of function fx. If the function includes varargout in its definition, then nargout returns the negative of the number of outputs. For example, if function foo declares outputs a, b, and varargout, then nargout('foo') returns -3.

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    en fait il y a 1 seul argument de sortie qui est varargout
    donc nargout(@set) devrait valoir -1. C'est d'ailleurs bien le cas pour une de mes fonctions renvoyant simplement varargout !

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    effectivement.

    En fait la sortie de set n'est pas un varargout, mais un seul élément qui est une structure dont les champs varient. en ouvrant la fonction set, on voit ça

    % A = SET(H)
    % SET(H)
    % returns or displays all property names and their possible values for
    % the object with handle H. The return value is a structure whose
    % field names are the property names of H, and whose values are
    % cell arrays of possible property values or empty cell arrays.
    %
    % The default value for an object property can be set on any of an
    % object's ancestors by setting the PropertyName formed by
    % concatenating the string 'Default', the object type, and the
    % property name. For example, to set the default color of text objects
    % to red in the current figure window:
    d'ou la valeur 1 pour nargout(@set)

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Oui mais bon, sachant qu'elle peut aussi ne rien renvoyer si elle a 3 inputs, le problème reste entier.
    L'autre explication possible, c'est qu'il y a deux fonctions set() et que Matlab est capable de sélectionner la bonne en fonction du nombre d'inputs... ce qui n'est ni matlab-esque, ni documenté !

    Pour moi c'est un bug

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    ouais c'est clairement un peu foireux. par contre je ne pense pas qu'il y ait deux fonctions set.

    j'ai fait un test avec ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function sortie = test_func(varargin)
    if nargin == 0
        sortie = cell(1,5);
    elseif nargin == 1
        sortie = ones(1,5);
    elseif nargin>1
        %on ne met rien
    end
    end
    Ce qui donne le même comportement qu'avec set

    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
     
    >> nargout(@test_func)
     
    ans =
     
         1
     
    >> a = test_func()
     
    a = 
     
        []    []    []    []    []
     
    >> a = test_func(1)
     
    a =
     
         1     1     1     1     1
     
    >> a = test_func(1,2)
    Error in test_func (line 2)
    if nargin == 0
     
    Output argument "sortie" (and maybe others) not assigned during call to
    "C:\Users\FT077750\Desktop\BGS_1309\Softs\03-Script_Matlab\Generateur_trajectoire\test_func.m>test_func".
    mais ouais pour un truc built-in c'est pas folichon.

  9. #9
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Effectivement, il est possible d'implémenter un nombre variable (mais borné) d'outputs dans une fonction sans varargout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function r = set(h, varargin)
         ....
         r0 = ....
         if nargout > 0; r = r0; end
      end
    Et donc nargin() et nargout() sont terriblement inutiles !!!

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

Discussions similaires

  1. set term ^
    Par tux dans le forum Débuter
    Réponses: 8
    Dernier message: 12/10/2004, 20h42
  2. Créer les get et set des classes
    Par cameleon2002 dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/09/2003, 21h03
  3. IB 6.0.1 - Win XP - Character Set
    Par SuperTotor dans le forum InterBase
    Réponses: 4
    Dernier message: 03/06/2003, 20h25
  4. Query data set
    Par Sandra dans le forum JBuilder
    Réponses: 3
    Dernier message: 20/01/2003, 10h08
  5. character set // Nls_lang
    Par fopicht dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2002, 12h04

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