Bonjour,
je souhaite écrire une fonction imbriquée qui récupère les valeurs de plusieurs champs d'une structure qui est située dans la fonction principale. Comment puis-je procéder?
Bonjour,
je souhaite écrire une fonction imbriquée qui récupère les valeurs de plusieurs champs d'une structure qui est située dans la fonction principale. Comment puis-je procéder?
Bonjour,
Tu peux passer ta structure (ou les champs qui t'intéressent) en argument de ta fonction, non?
Pour une bonne utilisation des balises code c'est ici!
Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources
La nature est un livre écrit en langage mathématique. Galilée.
Bonjour,
Comme ca:
Bonne apm,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 function ma_fcn_principale donnee = struct('champ1',1, 'champ2', 3, 'champ3', 6); function ma_fcn_imbriquee donnee.champ2+donnee.champ3 end end
Duf
Simulink & Embedded Coder
Au boulot : Windows 7 , MATLAB r2016b
A la maison : ArchLinux mais pas MATLAB
annuler est ma fonction imbriquée,
donnes est ma structure. C'est en fait un tableau de structure. Chaque sous-structure possède 4 champs (qui ont le même nom mais des valeurs propres à chaque sous-structure). Je souhaite en utiliser/modifier deux des quatre.
J'ai essayé de passer la structure en argument, mais sans résultat :
(avec ce code là, matlab me retourne unexpected matlab expression)
Code : Sélectionner tout - Visualiser dans une fenêtre à part function annuler(struct donnes)
j'ai aussi essayé sans argument, j'ai alors Too many input argument
enfin j'ai également essayé la syntaxe suivante
où j'obtiens le même message d'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part function annuler(donnes)
J'ai également essayé ceci :
(où val et pos sont de des quatre champs des sous-structures)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function annuler(obj,event) valid = [donnes.val]; p = donnes.pos;
Dans ce cas, matlab ne reconnaît pas la structure donnes déclarées dans la fonction mère.
J'avoue que là, je suis assez perdue...
Ce qu'il aurait fallu préciser c'est que ta fonction annuler a été créée pour un GUI, surement en tant que callback, non ?
Dans ce cas je te conseille la lecture du tutoriel : Développement efficace des interfaces graphiques (GUI)
Tu peux toujours utiliser les nested functions (fonctions imbriquées) comme l'a montré Duf. Il suffit de rajouter un END à la fin de chaque sous-fonction et de la fonction principale.
Dans ce cas les sous-fonctions connaitront les variables créées dans la fonction principale (mais pas celles des autres sous-fonctions), et la fonction principale prendra en compte les changements intervenus sur ces variables dans les sous-fonctions.
Oui en effet, je suis en train de créer un GUI
Mon problème est bien du à l'utilisation des fonctions imbriquées.
Tout d'abord, je me suis aperçue que j'avais déclaré ma structure dans un fonction imbriquée, ce qui faisait que ma deuxième fonction imbriquée ne la reconnaissait pas. J'ai changé ceci et l'ai déclaré dans ma fonction principale.
Maintenant, il s'avère que j'ajoute des sous-structures avec ma première sous-fonction. Quel est le moyen le plus efficace pour récupérer ces nouvelles sous-structures dans ma deuxième sous-fonction? (j'avoue que je ne manipule pas encore très bien les structures)
merci pour votre aide
C'est bon j'ai trouvé!
Il suffisait d'utiliser getfield et setfield!
En général ce n'est pas nécessaire, il faut mieux utiliser les champs dynamiques de structures si c'est parce que le nom de ton champ est dans une variable.
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 chp='champ'; a.(chp)=2;%setfield(a,chp,2); c=a.(chp);%c=getfield(a,chp);
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager