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 :

[structures] Erreur structure vide


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut [structures] Erreur structure vide
    J'ai declare une structure en global dans l'Opening function de mon GUI comme ci dessous:
    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
    global selected;
    selected=struct ( ...
    'prot', 'no selected prot',...
    'pres',0,...
    'frac',0,...
    'index_prot',0,...
    'index_pres',0,...
    'lines',[],...
    'tab',{},...
    'tab_size',0,...
    'targetName',{},...
    'type',{},...
    'dose',[],...
    'volume',[],...
    'result',[],...
    'currentName',{},...
    'color',[] );
    Plus tard, dans une autre fonction je veux modifier le champs index_prot de cette meme structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    global selected;
    selected.index_prot=get(handles.protocol_popupmenu,'Value');
    str=get(handles.protocol_popupmenu,'String');
    selected.prot=str{selected.index_prot};
    J'obtiens cette erreur que je ne comprends decidemment pas...
    ??? A dot name structure assignment is illegal when the structure is empty.
    Use a subscript on the structure.

    Error in ==> interfaceBis>protocol_popupmenu_Callback at 279
    selected.index_prot=get(handles.protocol_popupmenu,'Value');

    Error in ==> gui_mainfcn at 95
    feval(varargin{:});

    Error in ==> interfaceBis at 60
    gui_mainfcn(gui_State, varargin{:});

    ??? Error using ==> interfaceBis('protocol_popupmenu_Callback',gcbo,[],guidata(gcbo))
    A dot name structure assignment is illegal when the structure is empty.
    Use a subscript on the structure.

    ??? Error while evaluating uicontrol Callback
    Je ne trouve rien la dessus sur les forums ni sur le web.

    Quelqu'un peut-il m'aider s'il vous plait ???!! Ca fait trois jours que je cherche desesperement!! J'ai tout essaye. Enfin surement pas tout....

    Merci

  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 884
    Points
    52 884
    Par défaut
    On va déjà supprimer la variable globale... en utilisant GUIDATA

    Dans la fonction OpeningFcn tu fais ceci :
    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
    handles.selected=struct ( ...
    'prot', 'no selected prot',...
    'pres',0,...
    'frac',0,...
    'index_prot',0,...
    'index_pres',0,...
    'lines',[],...
    'tab',{},...
    'tab_size',0,...
    'targetName',{},...
    'type',{},...
    'dose',[],...
    'volume',[],...
    'result',[],...
    'currentName',{},...
    'color',[] );
     
    guidata(hObject,handles)
    Tu devrais maintenant avoir accès à handles.selected dans n'importe quelle partie du code du GUI.
    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
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Pourquoi est ce mieux d'enlever les globales ? ... Il me semble que c'est pour eviter les confusions entre les noms de variables, mais j'en ai seulement 8 ... C'est pas un gros gros code. Est ce que ca pose reellement un probleme?

    Je veux aussi pouvoir acceder a 'selected' dans d'autres fonctions (autres m-files) et ca n'a pas l'air possible avec ta methode... ?

    Sinon, pour mon erreur, quelqu'un sait-il comment la resoudre?? Je suis toujours bloquee.

    Merci

  4. #4
    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 884
    Points
    52 884
    Par défaut
    Citation Envoyé par emi3113
    Je veux aussi pouvoir acceder a 'selected' dans d'autres fonctions (autres m-files) et ca n'a pas l'air possible avec ta methode... ?
    Cela sera toujours possible avec GUIDATA (tant que l'objet Figure n'est pas détruit).
    Citation Envoyé par emi3113
    Sinon, pour mon erreur, quelqu'un sait-il comment la resoudre??
    Le problème vient de l'initalisation des champ contenant des tableaux de cellules dans la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >> S=struct('a',{})
     
    S = 
     
    0x0 struct array with fields:
        a
     
    >> S.a=0
    ??? A dot name structure assignment is illegal when the structure is empty.
      Use a subscript on the structure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> S=struct('a',[])
     
    S = 
     
        a: []
     
    >> S.a=0
     
    S = 
     
        a: 0
    Il faut donc initialiser ces champs avec [] et non pas {}.
    Même si c'est pour y stocker un tableau de cellules après
    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)

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Parfait ca marche! Ca venait bien des {}... Merci beaucoup d'avoir repondu aussi rapidement!

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut pourquoi eviter les variables globales?
    Par contre, je t'avoue ne pas avoir tout compris a l'histoire des variables globales...je prog en matlab depuis juste un mois.

    Si je fais ce que tu m'a dit , dois-je remplacer 'selected' par 'handles.selected' dans toutes mes fonctions y compris celles des autres m-files? Avec les variables globales, j'ai rien besoin de passer en argument des fonctions, c'est plus facile...

    Quelle est exactement la raison pour laquelle il faut tjs enlever les global... mes profs me disaient ca aussi en Java...

    Cordialement

  7. #7
    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 884
    Points
    52 884
    Par défaut
    Citation Envoyé par emi3113
    Quelle est exactement la raison pour laquelle il faut toujours enlever les global... mes profs me disaient ca aussi en Java...
    Et tous les profs... de tous les langages... dans toutes les universités

    L'avantage des variables globales : leur visibilité
    L'inconvénient des variables globales : leur visibilité

    Le fait qu'elles soient visibles de n'importe quel programme rend la programmation très dangereuse. On peut facilement écraser par erreur une variable globale. Dans le cas d'un programme simple conçu par un seul développeur, le risque est minime. Mais dans un projet plus important avec plusieurs développeurs qui travaillent en même temps sur des parties différentes d'un code, ça représente un réel danger.

    De plus, leur utilisation nuit à la lisibilité des codes. En effet, comme une variable globale peut être modifiée n'importe quand par n'importe quel programme, il est très difficle de suivre son évolution à la lecture du code.

    Voila (en résumé), pourquoi on préconise fortement de ne jamais utiliser de variables globales et d'utiliser plutôt des fonctions avec des arguments d'entrée et de sortie.

    De toute façon, c'est comme pour la célèbre commande GOTO, il y a toujours une alternative... toujours.
    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. Incrémentation d'un élément de structure : erreur de segmentation
    Par BOByTOX dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 27/04/2011, 18h37
  2. Pointeurs et structures: erreur de segmentation
    Par Skize dans le forum Débuter
    Réponses: 7
    Dernier message: 07/10/2010, 08h43
  3. erreur structure je pense
    Par darkwall_37 dans le forum Débuter
    Réponses: 4
    Dernier message: 06/04/2009, 21h40
  4. Structures, erreurs de compilation
    Par koktel_dfr dans le forum C
    Réponses: 10
    Dernier message: 24/05/2007, 14h30
  5. Réponses: 20
    Dernier message: 11/07/2006, 17h11

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