Error al convertir GUI's que funcionan bien en .exe
Publicado por Luis Manuel (21 intervenciones) el 05/07/2011 12:58:29
Hola, tengo un problema un poco extraño.
Tengo varias GUI con sus respectivos códigos fuente. Funcionan bien, el problema es cuando convierto esas GUI's a un ejecutable. Se ejecuta el programa pero por ejemplo a la hora de hacer cálculos da un error del tipo:
??? Undefined function or method 'mfun' for input arguments of type 'char'.
Error in ==> Directividad>PLOT_Callback at 93
Error in ==> gui_mainfcn at 96
Error in ==> Directividad at 22
Error in ==>
@(hObject,eventdata)Directividad('PLOT_Callback',hObject,eventdata,guidata(hObject)
??? Error while evaluating uicontrol Callback
Es muy extraño porque antes de usar mfun convierto las variables de las casillas a double. Y antes de convertir esto a ejecutable no da este tipo de error.
Pongo a continuación el código de esta gui donde da el error:
function varargout = Directividad(varargin)
%AUTOR: Luis Manuel Fernández Ortiz
%Esta interfaz representa la directividad de una Bocina Plano-E en función
%del parámetro que deseemos. Además calcula en función de una dimensión de
%la apertura de la Bocina la restante dimension para obtener una
%directividad óptima. Recordar que una directividad óptima ocurre cuando
%tenemos un error de fase: s=0.25
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Directividad_OpeningFcn, ...
'gui_OutputFcn', @Directividad_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
%Esta función implementa las condiciones iniciales de la interfaz. Tanto
%las imagenes que representan el eje de coordenadas usado para la bocina
%como que 'edit_text', 'static_text' y 'push_button' serán visibles e
%invisibles en su primera ejecución
function Directividad_OpeningFcn(hObject, ~, handles, varargin)
global DIRECTIVIDAD_OPTIMA SELECCION;
axes(handles.axes2)
[x,map]=imread('bOCINA_E.png','png');
image(x),colormap(map),axis off,hold on
set(handles.edit_p1,'Visible','off');
set(handles.text3,'Visible','off');
set(handles.p1,'Visible','off');
set(handles.text7,'Visible','off');
set(handles.text_griega5,'Visible','off');
set(handles.text_griega3,'Visible','off');
DIRECTIVIDAD_OPTIMA = 2;
SELECCION = 3;
handles.output = hObject;
guidata(hObject, handles);
function varargout = Directividad_OutputFcn(~, ~, handles)
varargout{1} = handles.output;
function PLOT_Callback(~, ~, handles)
global SELECCION;
if SELECCION == 1
% recojo los valores ingresados en las casillas
p1=str2double(get(handles.edit_p1,'string'));
b1=str2double(get(handles.edit_b1,'string'));
mx = str2double(get(handles.mx,'string'));
% me aseguro que los valores introducidos son correctos
if mx<=0 || isnan(mx)
errordlg('Valor máximo de abscisas incorrecto','ERROR');
return
elseif p1<=0 || b1<=0 || isnan(b1) || isnan(p1)
errordlg('Dimensiones reales y positivas','ERROR');
return
end
a = linspace(0,mx,1000);
% fórmula de la directividad para los valores introducidos
termino_Fresnel = b1./(sqrt(2*p1));
% cálculo de la integral de fresnel del coseno
C = mfun('FresnelC',termino_Fresnel);
% cálculo de la integral de fresnel del seno
S = mfun('FresnelS',termino_Fresnel);
directividad = ((64.*a.*p1)./(pi.*b1)).*(C.^2+S.^2);
axes(handles.axes1);
handles.x=a;
% se grafica la función
handles.h=plot(a,directividad);
title('Directividad en función de a (unidades naturales)');
xlabel('a');
elseif SELECCION == 2
%recojo los valores ingresados en las casillas
p1=str2double(get(handles.edit_p1,'string'));
mx=str2double(get(handles.mx,'string'));
a=str2double(get(handles.edit_a,'string'));
%me aseguro que los valores introducidos son correctos
if mx<=0 || isnan(mx)
errordlg('Valor máximo de abscisas incorrecto','ERROR');
return
elseif p1<=0 || a<=0 || isnan(a) || isnan(p1)
errordlg('Dimensiones reales y positivas','ERROR');
return
end
b1 = linspace(0,mx,1000);
termino_Fresnel = b1./(sqrt(2*p1));
%calculos las integrales de fresnel
C = mfun('FresnelC',termino_Fresnel);
S = mfun('FresnelS',termino_Fresnel);
%represento la directividad en función de b1
directividad = ((64.*a.*p1)./(pi.*b1)).*(C.^2+S.^2);
axes(handles.axes1);
handles.x=b1;
handles.h=plot(b1,directividad);
title('Directividad en función de b_{1} (unidades naturales)');
xlabel('b_{1}');
elseif SELECCION == 3
%recojo los valores introducidos en las casillas
mx=str2double(get(handles.mx,'string'));
a=str2double(get(handles.edit_a,'string'));
b1 = str2double(get(handles.edit_b1,'string'));
%me aseguro que los valores introducidos son correctos
if mx<=0 || isnan(mx)
errordlg('Valor máximo eje incorrecto','ERROR');
return
elseif b1<=0 || a<=0 || isnan(a) || isnan(b1)
errordlg('Dimensiones reales y positivas','ERROR');
return
end
p1=linspace(0,mx,1000);
termino_Fresnel = b1./(sqrt(2*p1));
%calculo las integrales de Fresnel del coseno y del seno
C = mfun('FresnelC',termino_Fresnel);
S = mfun('FresnelS',termino_Fresnel);
%se representa la directividad en función de p1
directividad = ((64.*a.*p1)./(pi.*b1)).*(C.^2+S.^2);
axes(handles.axes1);
handles.x=p1;
handles.h=plot(p1,directividad);
title('Directividad en función de \rho_{1} (unidades naturales)');
xlabel('\rho_{1}');
end
%Esta función implementa el cuadro de control superior, en donde en
%función de que parámetro represento la directividad, desaparecen y
%aparecen los elementos pertinentes
function Eje_abscisas_SelectionChangeFcn(~, eventdata, handles)
set([handles.edit_b1 handles.edit_a handles.edit_p1 handles.text1...
handles.text2 handles.text3 handles.text_griega1...
handles.text_griega2 handles.text_griega3],'Visible','on');
global SELECCION;
switch get(eventdata.NewValue,'Tag')
case 'button_a'
set(handles.edit_a,'Visible','off');
set(handles.text1,'Visible','off');
set(handles.text_griega1,'Visible','off');
SELECCION=1;
case 'button_b1'
set(handles.edit_b1,'Visible','off');
set(handles.text2,'Visible','off');
set(handles.text_griega2,'Visible','off');
SELECCION=2;
case 'button_p1'
set(handles.edit_p1,'Visible','off');
set(handles.text3,'Visible','off');
set(handles.text_griega3,'Visible','off');
SELECCION=3;
end
%Esta función controla el cuadro de control inferior encargado de
%seleccionar qué parámetro quiero calcular para una directividad óptima
%fijando el restante. Hace aparecer y desaparecer en función de la
%elección los elementos pertinentes
function directividad_optima_SelectionChangeFcn(~, eventdata, handles)
set([handles.b1 handles.text6 handles.p1 handles.text7...
handles.text_griega4 handles.text_griega5],'Visible','on');
global DIRECTIVIDAD_OPTIMA;
switch get(eventdata.NewValue,'Tag')
case 'radiobutton6'
set(handles.b1,'Visible','off');
set(handles.text6,'Visible','off');
set(handles.text_griega4,'Visible','off');
DIRECTIVIDAD_OPTIMA=1;
case 'radiobutton7'
set(handles.p1,'Visible','off');
set(handles.text7,'Visible','off');
set(handles.text_griega5,'Visible','off');
DIRECTIVIDAD_OPTIMA=2;
end
%Esta función se encarga de lanzar un mensaje en el cuadro de texto
%indicando el valor calculado en función de tu elección para una
%directividad óptima
function OPTIMA_Callback(~, ~, handles)
global DIRECTIVIDAD_OPTIMA;
global B1 P1;
if DIRECTIVIDAD_OPTIMA == 1
p1=str2double(get(handles.p1,'string'));
if p1<=0 || isnan(p1)
errordlg('Ingresa un valor correcto para p1 (real y positivo)',...
'ERROR');
return
end
b1=sqrt(2*p1);
b1_string=num2str(b1);
b1_string=strcat(b1_string,'*lambda');
String='Para una directividad óptima en función de p1: b1=';
String=strcat(String,b1_string);
set(handles.Static_text_resultado,'String',String);
B1=b1;
P1=p1;
elseif DIRECTIVIDAD_OPTIMA == 2
b1=str2double(get(handles.b1,'string'));
if b1<=0 || isnan(b1)
errordlg('b1 debe ser real y positivo','ERROR');
return
end
p1=(b1^2)/2;
p1_string=num2str(p1);
p1_string=strcat(p1_string,'*lambda');
String='Para una directividad óptima en función de b1: p1=';
String=strcat(String,p1_string);
set(handles.Static_text_resultado,'String',String);
B1=b1;
P1=p1;
end
%Cuando se pulsa el ATRAS, volvemos al interfaz de selección de Bocinas
function ATRAS_Callback(~, ~, ~)
clear all;
close(Directividad);
INTRODUCCION;
%Cuando pulsamos IR A DIAGRAMAS DE RADIACIÓN, se cierra la ventana actual
%y aparece el interfaz donde podremos ver otras opciones referentes a los
%patrones de radiación de una Bocina Plano-E
function RADIACION_E_Callback(~, ~, ~)
close(Directividad);
Radiacion_E;
Si alguien me pudiera hechar una mano estaría muy agradecido.
Un saludo,
Luis
Tengo varias GUI con sus respectivos códigos fuente. Funcionan bien, el problema es cuando convierto esas GUI's a un ejecutable. Se ejecuta el programa pero por ejemplo a la hora de hacer cálculos da un error del tipo:
??? Undefined function or method 'mfun' for input arguments of type 'char'.
Error in ==> Directividad>PLOT_Callback at 93
Error in ==> gui_mainfcn at 96
Error in ==> Directividad at 22
Error in ==>
@(hObject,eventdata)Directividad('PLOT_Callback',hObject,eventdata,guidata(hObject)
??? Error while evaluating uicontrol Callback
Es muy extraño porque antes de usar mfun convierto las variables de las casillas a double. Y antes de convertir esto a ejecutable no da este tipo de error.
Pongo a continuación el código de esta gui donde da el error:
function varargout = Directividad(varargin)
%AUTOR: Luis Manuel Fernández Ortiz
%Esta interfaz representa la directividad de una Bocina Plano-E en función
%del parámetro que deseemos. Además calcula en función de una dimensión de
%la apertura de la Bocina la restante dimension para obtener una
%directividad óptima. Recordar que una directividad óptima ocurre cuando
%tenemos un error de fase: s=0.25
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Directividad_OpeningFcn, ...
'gui_OutputFcn', @Directividad_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
%Esta función implementa las condiciones iniciales de la interfaz. Tanto
%las imagenes que representan el eje de coordenadas usado para la bocina
%como que 'edit_text', 'static_text' y 'push_button' serán visibles e
%invisibles en su primera ejecución
function Directividad_OpeningFcn(hObject, ~, handles, varargin)
global DIRECTIVIDAD_OPTIMA SELECCION;
axes(handles.axes2)
[x,map]=imread('bOCINA_E.png','png');
image(x),colormap(map),axis off,hold on
set(handles.edit_p1,'Visible','off');
set(handles.text3,'Visible','off');
set(handles.p1,'Visible','off');
set(handles.text7,'Visible','off');
set(handles.text_griega5,'Visible','off');
set(handles.text_griega3,'Visible','off');
DIRECTIVIDAD_OPTIMA = 2;
SELECCION = 3;
handles.output = hObject;
guidata(hObject, handles);
function varargout = Directividad_OutputFcn(~, ~, handles)
varargout{1} = handles.output;
function PLOT_Callback(~, ~, handles)
global SELECCION;
if SELECCION == 1
% recojo los valores ingresados en las casillas
p1=str2double(get(handles.edit_p1,'string'));
b1=str2double(get(handles.edit_b1,'string'));
mx = str2double(get(handles.mx,'string'));
% me aseguro que los valores introducidos son correctos
if mx<=0 || isnan(mx)
errordlg('Valor máximo de abscisas incorrecto','ERROR');
return
elseif p1<=0 || b1<=0 || isnan(b1) || isnan(p1)
errordlg('Dimensiones reales y positivas','ERROR');
return
end
a = linspace(0,mx,1000);
% fórmula de la directividad para los valores introducidos
termino_Fresnel = b1./(sqrt(2*p1));
% cálculo de la integral de fresnel del coseno
C = mfun('FresnelC',termino_Fresnel);
% cálculo de la integral de fresnel del seno
S = mfun('FresnelS',termino_Fresnel);
directividad = ((64.*a.*p1)./(pi.*b1)).*(C.^2+S.^2);
axes(handles.axes1);
handles.x=a;
% se grafica la función
handles.h=plot(a,directividad);
title('Directividad en función de a (unidades naturales)');
xlabel('a');
elseif SELECCION == 2
%recojo los valores ingresados en las casillas
p1=str2double(get(handles.edit_p1,'string'));
mx=str2double(get(handles.mx,'string'));
a=str2double(get(handles.edit_a,'string'));
%me aseguro que los valores introducidos son correctos
if mx<=0 || isnan(mx)
errordlg('Valor máximo de abscisas incorrecto','ERROR');
return
elseif p1<=0 || a<=0 || isnan(a) || isnan(p1)
errordlg('Dimensiones reales y positivas','ERROR');
return
end
b1 = linspace(0,mx,1000);
termino_Fresnel = b1./(sqrt(2*p1));
%calculos las integrales de fresnel
C = mfun('FresnelC',termino_Fresnel);
S = mfun('FresnelS',termino_Fresnel);
%represento la directividad en función de b1
directividad = ((64.*a.*p1)./(pi.*b1)).*(C.^2+S.^2);
axes(handles.axes1);
handles.x=b1;
handles.h=plot(b1,directividad);
title('Directividad en función de b_{1} (unidades naturales)');
xlabel('b_{1}');
elseif SELECCION == 3
%recojo los valores introducidos en las casillas
mx=str2double(get(handles.mx,'string'));
a=str2double(get(handles.edit_a,'string'));
b1 = str2double(get(handles.edit_b1,'string'));
%me aseguro que los valores introducidos son correctos
if mx<=0 || isnan(mx)
errordlg('Valor máximo eje incorrecto','ERROR');
return
elseif b1<=0 || a<=0 || isnan(a) || isnan(b1)
errordlg('Dimensiones reales y positivas','ERROR');
return
end
p1=linspace(0,mx,1000);
termino_Fresnel = b1./(sqrt(2*p1));
%calculo las integrales de Fresnel del coseno y del seno
C = mfun('FresnelC',termino_Fresnel);
S = mfun('FresnelS',termino_Fresnel);
%se representa la directividad en función de p1
directividad = ((64.*a.*p1)./(pi.*b1)).*(C.^2+S.^2);
axes(handles.axes1);
handles.x=p1;
handles.h=plot(p1,directividad);
title('Directividad en función de \rho_{1} (unidades naturales)');
xlabel('\rho_{1}');
end
%Esta función implementa el cuadro de control superior, en donde en
%función de que parámetro represento la directividad, desaparecen y
%aparecen los elementos pertinentes
function Eje_abscisas_SelectionChangeFcn(~, eventdata, handles)
set([handles.edit_b1 handles.edit_a handles.edit_p1 handles.text1...
handles.text2 handles.text3 handles.text_griega1...
handles.text_griega2 handles.text_griega3],'Visible','on');
global SELECCION;
switch get(eventdata.NewValue,'Tag')
case 'button_a'
set(handles.edit_a,'Visible','off');
set(handles.text1,'Visible','off');
set(handles.text_griega1,'Visible','off');
SELECCION=1;
case 'button_b1'
set(handles.edit_b1,'Visible','off');
set(handles.text2,'Visible','off');
set(handles.text_griega2,'Visible','off');
SELECCION=2;
case 'button_p1'
set(handles.edit_p1,'Visible','off');
set(handles.text3,'Visible','off');
set(handles.text_griega3,'Visible','off');
SELECCION=3;
end
%Esta función controla el cuadro de control inferior encargado de
%seleccionar qué parámetro quiero calcular para una directividad óptima
%fijando el restante. Hace aparecer y desaparecer en función de la
%elección los elementos pertinentes
function directividad_optima_SelectionChangeFcn(~, eventdata, handles)
set([handles.b1 handles.text6 handles.p1 handles.text7...
handles.text_griega4 handles.text_griega5],'Visible','on');
global DIRECTIVIDAD_OPTIMA;
switch get(eventdata.NewValue,'Tag')
case 'radiobutton6'
set(handles.b1,'Visible','off');
set(handles.text6,'Visible','off');
set(handles.text_griega4,'Visible','off');
DIRECTIVIDAD_OPTIMA=1;
case 'radiobutton7'
set(handles.p1,'Visible','off');
set(handles.text7,'Visible','off');
set(handles.text_griega5,'Visible','off');
DIRECTIVIDAD_OPTIMA=2;
end
%Esta función se encarga de lanzar un mensaje en el cuadro de texto
%indicando el valor calculado en función de tu elección para una
%directividad óptima
function OPTIMA_Callback(~, ~, handles)
global DIRECTIVIDAD_OPTIMA;
global B1 P1;
if DIRECTIVIDAD_OPTIMA == 1
p1=str2double(get(handles.p1,'string'));
if p1<=0 || isnan(p1)
errordlg('Ingresa un valor correcto para p1 (real y positivo)',...
'ERROR');
return
end
b1=sqrt(2*p1);
b1_string=num2str(b1);
b1_string=strcat(b1_string,'*lambda');
String='Para una directividad óptima en función de p1: b1=';
String=strcat(String,b1_string);
set(handles.Static_text_resultado,'String',String);
B1=b1;
P1=p1;
elseif DIRECTIVIDAD_OPTIMA == 2
b1=str2double(get(handles.b1,'string'));
if b1<=0 || isnan(b1)
errordlg('b1 debe ser real y positivo','ERROR');
return
end
p1=(b1^2)/2;
p1_string=num2str(p1);
p1_string=strcat(p1_string,'*lambda');
String='Para una directividad óptima en función de b1: p1=';
String=strcat(String,p1_string);
set(handles.Static_text_resultado,'String',String);
B1=b1;
P1=p1;
end
%Cuando se pulsa el ATRAS, volvemos al interfaz de selección de Bocinas
function ATRAS_Callback(~, ~, ~)
clear all;
close(Directividad);
INTRODUCCION;
%Cuando pulsamos IR A DIAGRAMAS DE RADIACIÓN, se cierra la ventana actual
%y aparece el interfaz donde podremos ver otras opciones referentes a los
%patrones de radiación de una Bocina Plano-E
function RADIACION_E_Callback(~, ~, ~)
close(Directividad);
Radiacion_E;
Si alguien me pudiera hechar una mano estaría muy agradecido.
Un saludo,
Luis
Valora esta pregunta
0