Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Environnements de développement > MATLAB > GUI

GUI Forum d'entraide sur les interfaces graphiques en MATLAB

Réponse
 
Outils de la discussion
Vieux 04/12/2008, 14h38   #1 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
Par défaut [débutant]passage d'une fonction a une autre dans deux fichiers différents.

Bonjour a tous,
Voila j'ai une fonction qui se nomme "SaveDataMat", qui se trouve dans un fichier "filproc.m". Par ailleurs j'ai aussi une fonction qui se nomme "bnSave_callback" dans un fichier "frmExprtmarks.m". Dans le fichier "filproc.m" il y a une fonction d'enregistrement qui se nomme"SaveDataMat". Je voudrais savoir comment depuis "bnSave_callback " dans le fichier "frmExprtmark" je puis appeler "SaveDataMat" dans le fichier "filproc".
Voici les codes correspondant aux différentes fonctions :
SaveDataMat :
Code :
%FUNCTION for saving processed data in .MAT-file
%This function is called by mnSaveDispl_Callback - 
% menu item File->Saving of .MAT-files->Save displayed data in single file
function SaveDataMAT(Path, fName, SmartXXX, RawDataset, srcPath, trials, IChansAdded, Nms, varargin)
%Titles for synchronization modes
SynModes=[{'maximum value'}, {'minimum value'},{'global extremum'}, ...
    {'begin of decrease'},{'begin of increase'},{'specific value'}];
%define MATRIX size for data saving 
  d3=size(SmartXXX,1); %the NUMBER of Trials (i.e. files)
  d12=zeros(d3,3);
  for dz=1:d3      %CYCLE by FILES
    for dtype=1:3  %CYCLE by data type    
      d12(dz,dtype)=size(SmartXXX{dz}{4}{dtype},1);
    end  
  end
  dz12=max(d12,[],1); %vector-array (3 elems.) of MAX sizes for kinemat., EMG, FC
  nLabs=SmartXXX{1}{3}(:); %The Number of labels of each type
  opCell=cell(3,1);
%define structure array size for data saving   
  for dtype=1:3      %CYCLE by data type 
    ouDat=zeros(dz12(dtype),nLabs(dtype), d3);  
%If data of varios length - equalize the lengths by adding NaN values    
    for dz=1:d3      %CYCLE by FILES
      difz=dz12(dtype)-d12(dz,dtype);
      if difz>0 ouDat(:, :, dz)=[SmartXXX{dz}{4}{dtype}; NaN(difz,nLabs(dtype))];
      else ouDat(:, :, dz)=SmartXXX{dz}{4}{dtype}; end 
    end 
    opCell{dtype}=ouDat;
  end    
  ffreq=[{'Frequency-kinematics'},{'Frequency-EMG'},{'Frequency-Force Platform'}];
  ffreq(2,:)=num2cell(SmartXXX{1}{1});
% outdat - structure to save in .MAT-file
% build this structure from information loaded 
%& recieved during data processing
  outdat = struct('SourcePath', [], 'Trials',[],'Kinematics', [],'EMG',[], ...
         'ForcePlate',[],'Frequencies',[], 'Labels',[],'DataStruct',[],'RawDataStruct',[]);
  outdat.Kinematics=opCell{1};
  outdat.EMG=opCell{2};
  outdat.ForcePlate=opCell{3};
  outdat.Frequencies=ffreq;
  outdat.Labels=SmartXXX{1}{2};
  outdat.DataStruct=SmartXXX{1}{3};
  outdat.RawDataStruct=RawDataset;
  outdat.SourcePath=srcPath;
  outdat.Trials=trials;
  outdat.AddedChansInfo=IChansAdded;
  outdat.StartTime=SmartXXX{1}{7};
  if size(varargin,2)>0 %data were synchronized - synchro data mode 
    s1=char(SynModes(varargin{1})); %Mode of synchronization
    s=sprintf('Data synchronized on label %s (by %s)',varargin{2},s1); %which label was used for synchronization    
 %   varargin=>  SynModes(sMode), synLabel  
    outdat.SynchrInfo=s;
  end  
%SAVING marker information
  MInfo=cell(d3,1); %place allocation for info of markers
  for ntr=1:d3      %CYCLE by TRIALS
   if size(SmartXXX{ntr},2)==8 %THERE is info of MARKERS
     MInfo{ntr}=SmartXXX{ntr}{8}; 
   end
  end
  outdat.MarkerInfo=MInfo;
  outdat.MarkerNumber=Nms; %MAX marker number
  save([Path, fName], 'outdat');
end
Pour la fonction bnSave_callback
Code :
function bnSave_Callback(hObject, eventdata, handles)
global expdMarks Nmax  SmartData nLab PathName FileName
% hObject    handle to bnSave (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
ls=get(handles.lbLabs2copy,'String');
for nm=1:length(expdMarks)
  nTr=expdMarks(nm).Tr;
  if expdMarks(nm).Lb>nLab
    nL=expdMarks(nm).Lb-1;
  else
    nL=expdMarks(nm).Lb;  
  end    
  LabNam=ls(nL);
  Nmax=Nmax+1;
  mInf=expdMarks(nm).mInfo;
  mrkInfo=struct('Label',LabNam, 'XY', mInf(1:2),'nMarker',Nmax); %MARKER info 
  if size(SmartData{nTr},2)<8
     SmartData{nTr}{8}=mrkInfo; 
  else
     SmartData{nTr}{8}=[SmartData{nTr}{8} mrkInfo]; 
  end    
end
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
FileName
PathName
mrkInfo
save (PathName, FileName, mrkInfo);
close
Je pourrai vous donner d'autres informations, mais peut être que celles-ci vous suffisent. Ceci fait partie d'un programme beaucoup plus gros où je ne me retrouve pas vraiment. Mais reprendre le code de quelqu'un sans s'être vu n'est pas facile.
Merci de vos réponse en attendant.
pompier21 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 04/12/2008, 14h59   #2 (permalink)
Modératrice
 
Avatar de Caro-Line
 
Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
Par défaut

Bonjour,

Tu ne peux pas appeler directement la sous-fonction (SaveDataMAT) d'une fonction (filproc) sans passer par cette fonction (filproc).

Tu es donc obligé d'appeler filproc, et de prévoir dans filproc le cas où tu veux aller directement dans SaveDataMAT.

Ce n'est pas forcément très clair j'en suis consciente alors un petit exemple :
Code :
%========= Fichier filproc.m
function filproc(varargin)
%il faudrait vérifier les arguments d'entree ici
switch varargin{1}
case 'SaveData'
   SaveDataMAT(varargin(2:end));
end
%ici ta sous-fonction SaveDataMAT

%====================
%Dans l'autre fichier frmExprtmarks.m
%blablabla

%la sous-fonction bnSave_callback
function bnSave_Callback(hObject, eventdata, handles)
%blablabla
%appel à SaveData :
filproc('SaveData',...les arguments qui vont bien);
C'est une possibilité qui vaut ce qu'elle vaut (pas grand-chose...)

L'autre possibilité serait de sortir ta sous-fonction SaveDataMAT de la fonction filproc et d'en faire une fonction à part entière (plus propre à mon avis).
Dans ce cas il serait bon de la renommer (il faut mieux mettre les noms de fonction entièrement en minuscules) et de savoir exactement où elle est déjà appelée.

PS : si je peux me permettre, je vois que tu utilises des variables globales, je pense te l'avoir déjà dit mais on ne le dira jamais assez : les variables global c'est le MAL !!
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi

Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici.

Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan)

GETA
Caro-Line est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 04/12/2008, 16h45   #3 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
Par défaut pour les variables globales !!!!!!!!

rebonjour
J'avais bien noté votre aversion pour les variables globales, mais je n'y suis pour rien, je récupère un code d'un russe qui parle anglais et je ne sais pas trop ce qu'il a fait. J'ai 100 pages de codes que je ne comprends pas (avec des fonctions partout et des variables qui changent régulièrement de nom) mais je dois faire des choses avec d'ici le mois de janvier. Donc c'est un peu la galère. Mais merci de votre aide, je vais m'y atacher des demain matin, et je pense que j'aurai d'autres questions pour vous a ce sujet, car je n'ai pas tout saisi. Mais en réfléchissant bien, j'espère trouver une solution, avec vos indications.

Merci encore et a bientot.
pompier21 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/12/2008, 11h41   #4 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
Par défaut Je n'y arrive pas mais je pense a une autre solution

Bonjour a vous
depuis ce matin j'ai essayé de mettre en application vos conseil. Voici le code de la fonction filproc
Code :
function varargout = fileproc(varargin)
% FILEPROC M-file for fileproc.fig
%  FILEPROC: main running form (window) and function of the program.
%  In order to begin data processing load one or several .TDF-files
%  OR one .MAT-file, created earlier by this program
%  on the base of 1 or more .TDF-files.
%  After processing your data you may save results in .MAT-file:
%  Menu File->Saving of .MAT-files->Save displayed data in single file
%  (if you've changed data and not saving the changes try to exit,
%  the program will demand a confirmation).

% Last Modified by GUIDE v2.5 14-Nov-2008 23:02:08

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @fileproc_OpeningFcn, ...
                   'gui_OutputFcn',  @fileproc_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
switch varargin{1}
    case 'SaveData'
        SaveMATfile(varargin(2:end));
    end
end
et le code de la fonction bnSave-callback du fichier frmExprtmarks.m
Code :
function bnSave_Callback(hObject, eventdata, handles)
global expdMarks Nmax  SmartData nLab PathName FileName
% hObject    handle to bnSave (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
ls=get(handles.lbLabs2copy,'String');
for nm=1:length(expdMarks)
  nTr=expdMarks(nm).Tr;
  if expdMarks(nm).Lb>nLab
    nL=expdMarks(nm).Lb-1;
  else
    nL=expdMarks(nm).Lb;  
  end    
  LabNam=ls(nL);
  Nmax=Nmax+1;
  mInf=expdMarks(nm).mInfo;
  mrkInfo=struct('Label',LabNam, 'XY', mInf(1:2),'nMarker',Nmax); %MARKER info 
  if size(SmartData{nTr},2)<8
     SmartData{nTr}{8}=mrkInfo; 
  else
     SmartData{nTr}{8}=[SmartData{nTr}{8} mrkInfo]; 
  end    
end
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
FileName
PathName
SmartData{nTr}{8}
save (PathName, FileName, 'mrkInfo');
filproc ('SaveData',PathName,FileName,mrkInfo);
close
ceci ne fait pas l'affaire, mais j'ai du me tromper quelque part.
Par contre la commande "save" ne crée aucun fichier, alors qu'il ouvre bien la boite de dialogue pour récupérer le chemin et les noms des fichiers a enregistrer. Je pense que c'est une solution moins compliquée que l'appel a une fonction d'un autre fichier.
Si vous pouviez me débrouiller cela se serait bien et comme j'en ai besoin ailleurs, cela me ferait un exemple pour pouvoir enregistrer des données dans un fichier .mat
Merci d'avance de me faire avancer dans cette foret où je n'ai pas de boussole pour m'orienter !!!!!!
pompier21 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/12/2008, 12h37   #5 (permalink)
Modératrice
 
Avatar de Caro-Line
 
Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
Par défaut

Bon il y a plusieurs problèmes dans ton code.

1. Ceci :
Code :
% End initialization code - DO NOT EDIT
signifie :
NE PAS EDITER EN DESSOUS DE CETTE LIGNE...

Donc il faudrait plutôt faire ainsi :
Code :
function varargout = fileproc(varargin)
% FILEPROC M-file for fileproc.fig
%  FILEPROC: main running form (window) and function of the program.
%  In order to begin data processing load one or several .TDF-files
%  OR one .MAT-file, created earlier by this program
%  on the base of 1 or more .TDF-files.
%  After processing your data you may save results in .MAT-file:
%  Menu File->Saving of .MAT-files->Save displayed data in single file
%  (if you've changed data and not saving the changes try to exit,
%  the program will demand a confirmation).

% Last Modified by GUIDE v2.5 14-Nov-2008 23:02:08

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @fileproc_OpeningFcn, ...
                   'gui_OutputFcn',  @fileproc_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);

%Cas spécifique :
if nargin %il y a au moins un argument
   if strcmp(varargin{1},'SaveData') %le premier arg est SaveData
      SaveMATfile(varargin(2:end));
      return
   end
end

if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
Ceci dit ce n'est pas très joli comme solution (même si je l'ai proposée), tu devrais plutôt sortir carrément la fonction de sauvegarde.

Pour le problème de sauvegarde, cette ligne :
Code :
save (PathName, FileName, 'mrkInfo');
Attention à tes arguments, ici tu lui dit de sauver dans un fichier représenté par la variable PathName les variables mrkInfo et la variable représentée par la variable FileName....
C'est plutôt :
Code :
save(fullfile(PathName,FileName),'mrkInfo');
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi

Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici.

Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan)

GETA
Caro-Line est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/12/2008, 14h18   #6 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
Par défaut rebonjour

je ne suis pas un expert mais le code
Code :
save(fullfile(PathName,FileName),'mrkInfo');
ne fonctionne pas, je n'ai toujours pas de fichier créé. Je suis encore planté devant l'adversité. Je sais que je suis un nul de chez nul, mais il me faudrait faire quelques petites choses, avec les 100 pages de code que j'ai, pour pouvoir m'en sortir. Mais cela n'a pas été fait par un informaticien, mais je dois faire avec. Bref si vous pouvez me faire enregister des fichiers avec la boite de dialogue ce serait bien. Je n'ai besoin , (mais en détails) que de cela, pour l'instant. Je suis débutant dans le domaine, et il me reste encore beaucoup de choses a apprendre. Mais si vous le voulez , comme l'a dit caro-line, les aidés d'aujourd'hui sont les aidant de demain.
j'ai besoin de vous tous, a bientot j'espère que vous me réponderez.
Merci a caro-line elle m'aide tellement que je ne sais pas comment la remercier!!!!
pompier21 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/12/2008, 14h25   #7 (permalink)
Modératrice
 
Avatar de Caro-Line
 
Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
Par défaut

Il n'y aurait pas un petit message d'erreur ?

Ça :
Code :
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
au lieu de FileName c'est une faute de copie du code ou une faute de frappe dans le code... ?
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi

Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici.

Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan)

GETA
Caro-Line est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/12/2008, 16h29   #8 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
Par défaut voici les message d'erreurs que j'ai

rebonjour j'espère pouvoir vous lire depuis chez moi car je travaille le soir. Voici les message d"'erreurs que j'ai lorsque je fais tourner le programme.
Code :
??? Undefined function or method 'eq' for input arguments of type 'cell'.

Error in ==> fullfile at 37
      if (f(end)==fs) & (part(1)==fs),

Error in ==> frmExprtmarks>bnSave_Callback at 358
save(fullfile(PathName,FileName),'mrkInfo');

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

Error in ==> frmExprtmarks at 42
    gui_mainfcn(gui_State, varargin{:});

??? Error using ==> waitfor
Error while evaluating uicontrol Callback
Ceci n'est pas tres conculant, mais peut être que cela vous donnera une idée. Pour l'instant il n'enregistre rien dans le fichier qu'il ne cré pas. Voici le code
Code :
function bnSave_Callback(hObject, eventdata, handles)
global expdMarks Nmax  SmartData nLab PathName FileName
% hObject    handle to bnSave (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
ls=get(handles.lbLabs2copy,'String');
for nm=1:length(expdMarks)
  nTr=expdMarks(nm).Tr;
  if expdMarks(nm).Lb>nLab
    nL=expdMarks(nm).Lb-1;
  else
    nL=expdMarks(nm).Lb;  
  end    
  LabNam=ls(nL);
  Nmax=Nmax+1;
  mInf=expdMarks(nm).mInfo;
  mrkInfo=struct('Label',LabNam, 'XY', mInf(1:2),'nMarker',Nmax); %MARKER info 
  if size(SmartData{nTr},2)<8
     SmartData{nTr}{8}=mrkInfo; 
  else
     SmartData{nTr}{8}=[SmartData{nTr}{8} mrkInfo]; 
  end    
end
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
FilName
PathName
SmartData{nTr}{8}
save(fullfile(PathName,FileName),'mrkInfo');
close
Je ne sais pas par quel bout le prendre mais en tout état de cause il n'enregistre rien. Je sais que cela n'est pas banal , et qu'il faudrait que vous ayez tout le code. C'est donc ce que je vais faire. En documents attaché je vous joint les différents programme qui composent ce logiciel. Je ne sais pas si vous aurez le temps de vous penchez dessus, mais cela est fait par un russe qui ne parle que l'anglais et que je soupsonne ne pas être informaticien.
Bref si vous pouvez m'aidez !!!!!!
a lundi car depuis chez moi je ne suis pas certain d'avoir acces au forum.
Fichiers attachés
Type de fichier : zip Fileprocnew.zip (104,7 Ko, 1 affichages)

Dernière modification par Caro-Line ; 05/12/2008 à 16h38 Motif: Suppression de mentions inutiles
pompier21 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/12/2008, 16h35   #9 (permalink)
Modératrice
 
Avatar de Caro-Line
 
Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
Par défaut

Il te dit qu'il y a un problème car l'un des paramètres rentré à FULLFILE est un tableau de cellules.

Le problème vient, je le soupçonne des variables globales.

Il faut faire très attention aux nom de tes variables.
FileName par exemple est une variable globale.

Quand tu utilises UIPUTFILE tu lui demande en sortie FilName (sans le E), mais après c'est FileName (avec le E) que tu utilises dans le SAVE.
Donc le FileName utilisé dans le SAVE est la variable globale qui a été définie un jour ailleurs et qui est surement de type CELL.

Je suppose que le vrai nom de fichier que tu veux utiliser est celui retourné par UIPUTFILE, donc vérifie bien partout l'écriture et que tu n'as pas de faute de frappe (car là manifestement il y en a une).
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi

Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici.

Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan)

GETA
Caro-Line est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2008, 10h41   #10 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
Par défaut il n'y a de pire faute que celle que l'on ne voit pas

Bonjour
Il y avait effectivement une faute de frappe. Je suis passé dessus plusieurs fois sans la voir et j'en demande pardon a ceux qui se sont penchés sur ce code pour une simple faute de frappe.
Merci a tous (et en particulier a cro-line) de votre aide.
A bientot
pompier21 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS MATLABFAQ MATLABTUTORIELS MATLABLIVRES MATLAB

Réponse

Précédent   Forum des développeurs > Environnements de développement > MATLAB > GUI



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide