Matlab - Error al convertir GUI's que funcionan bien en .exe

 
Vista:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error al convertir GUI's que funcionan bien en .exe

Publicado por Luis Manuel (21 intervenciones) el 07/07/2011 02:19:42
Si existe, mfun es una función de la libreria. El problema es porque en el ejecutable se queja de que no se le puede pasar argumentos tipo char, pero no son char puesto que se convierten a double antes, ademas que antes de pasarse a .exe funciona a la perfección.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar