Problem working with popupmenu
Show older comments
Hi guys.
I'm working on GUIDE and i have the next problem:
I have to make a conversor (Decimal, Hexadecimal, octal and bynary)
When i put a number in the edit 1 i have to choose in the "popupmenu1" what value is it (Decimal, Binary, Octal, Hexadecimal) then i choose in the popupmenu2 what value i want convert (Decimal, Binary, Octal, Hexadecimal) and the converted value has to set on the edit2.
mathlab gave me the next message:
"Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)convertidordecantidades('popupmenu2_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback."
I hope you guys can help me.

%This is my code%
value = str2double(handles.edittext1.String)
if handles.popupmenu1.Value == 1
if handles.popupmenu2.Value == 1
convertedValue = dec2bin(value);
elseif handles.popupmenu2.Value == 2
elseif handles.popupmenu2.Value == 3
elseif handles.popupmenu2.Value == 4
elseif handles.popupmenu2.Value == 5
end
elseif handles.popupmenu1.Value == 2
if handles.popupmenu2.Value == 1
convertedValue = dec2base(value,8);
elseif handles.popupmenu2.Value == 2
elseif handles.popupmenu2.Value == 3
elseif handles.popupmenu2.Value == 4
elseif handles.popupmenu2.Value == 5
end
elseif handles.popupmenu1.Value == 3
if handles.popupmenu2.Value == 1
convertedValue = dec2base(value,16);
elseif handles.popupmenu2.Value == 2
elseif handles.popupmenu2.Value == 3
elseif handles.popupmenu2.Value == 4
elseif handles.popupmenu2.Value == 5
end
elseif handles.popupmenu1.Value == 3
if handles.popupmenu2.Value == 1
elseif handles.popupmenu2.Value == 2
elseif handles.popupmenu2.Value == 3
elseif handles.popupmenu2.Value == 4
elseif handles.popupmenu2.Value == 5
end
elseif handles.popupmenu1.Value == 5
if handles.popupmenu2.Value == 1
elseif handles.popupmenu2.Value == 2
elseif handles.popupmenu2.Value == 3
elseif handles.popupmenu2.Value == 4
elseif handles.popupmenu2.Value == 5
end
end
handles.edit2.String = sprintf('2.%f',convertedValue)
30 Comments
Walter Roberson
on 15 Sep 2019
value = str2double(handles.edittext1.String)
That line is only valid if the input is decimal, which is not the case when you are converting from any base other than decimal. You should only be using that line when handles.popupmenu1.Value is 4.
Jhon Rackham
on 15 Sep 2019
Walter Roberson
on 15 Sep 2019
handles.edit2.String = sprintf('2.%f',convertedValue)
That line assumes that convertedValue is internal binary format (which would not be a bad thing) and assumes that the output is decimal, but the output should only be decimal if handles.popupmenu2.Value == 4.
You need to re-read
Jhon Rackham
on 15 Sep 2019
Image Analyst
on 15 Sep 2019
Edited: Image Analyst
on 15 Sep 2019
You're setting the converted value in each one of the if statements, right? Not just 3 of them, right?
Jhon Rackham
on 15 Sep 2019
Edited: Jhon Rackham
on 15 Sep 2019
Image Analyst
on 15 Sep 2019
It should work. Post your complete files, both the .fig and .m files. However I'm leaving for the day in a few minutes.
Walter Roberson
on 15 Sep 2019
value_in_str = handles.edittext1.String;
switch handles.popupmenu1.Value
case 1
value_in_dec = bin2dec(value_in_str);
case 2
value_in_dec = hex2dec(value_in_str);
end
switch handles.popupmenu2.Value
case 1
value_out_str = dec2bin(value_in_dec);
case 2
value_out_str = dec2hex(value_in_dec);
end
handles.edit2.String = value_out_str;
Jhon Rackham
on 15 Sep 2019
Image Analyst
on 15 Sep 2019
No, you did not have stuff inside each "elseif" block as you claimed. You need to have stuff in each one, like Walter showed. Don't skip any. You can use "if" or switch" - basically the same.
Jhon Rackham
on 15 Sep 2019
Jhon Rackham
on 15 Sep 2019
Jhon Rackham
on 15 Sep 2019
Walter Roberson
on 15 Sep 2019
What happened when you tried the code I posted in
https://www.mathworks.com/matlabcentral/answers/480482-problem-working-with-popupmenu#comment_746191
and what happened when you examined that and then went back to re-read my hints in https://www.mathworks.com/matlabcentral/answers/479628-how-to-make-a-program-that-conver-a-numer-to-binary-decimal-hexadecimal-and-octal#comment_744171 and used my hints to extend your code to handle other bases?
Jhon Rackham
on 15 Sep 2019
Jhon Rackham
on 15 Sep 2019
Jhon Rackham
on 15 Sep 2019
Walter Roberson
on 15 Sep 2019
It show me errors Mr Roberson.
Would you mind turning your screen by about 7 degrees so that I can read it from here with my binoculars? I'm having terrible difficulty with glare at the moment.
Jhon Rackham
on 15 Sep 2019
Jhon Rackham
on 15 Sep 2019
Walter Roberson
on 15 Sep 2019
So what did I suggest in https://www.mathworks.com/matlabcentral/answers/479628-how-to-make-a-program-that-conver-a-numer-to-binary-decimal-hexadecimal-and-octal#comment_744171 as the way to handle the other bases ?
Jhon Rackham
on 15 Sep 2019
Edited: Jhon Rackham
on 15 Sep 2019
Jhon Rackham
on 15 Sep 2019
Walter Roberson
on 15 Sep 2019
>> sscanf('123','%lo')
ans =
uint64
83
>> sprintf('%lo', 83)
ans =
'123'
>> 1*8^2 + 2*8^1 + 3*8^0
ans =
83
String to be converted goes as the first parameter to sscanf(), method of conversion goes as the second parameter to sscanf()
Jhon Rackham
on 15 Sep 2019
Jhon Rackham
on 15 Sep 2019
Walter Roberson
on 15 Sep 2019
Preventing the user from entering a number that is invalid for the currently selected base is complicated. It requires checking every keystroke as the user types it in, and handling deletions yourself, and (for obscure reasons) keeping track of what the user typed in by yourself.
It is a lot easier to validate the number at the time the conversion is requested.
- binary: all characters must be members of the set {'0', '1'}
- octal: all characters must be members of the set {'0', '1', '2', '3', '4', '5', '6', '7'}
- decimal: all characters must be members of the set {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
- hex: all characters must be members of the set {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f'}
Jhon Rackham
on 15 Sep 2019
Walter Roberson
on 15 Sep 2019
Consider
ismember('1236', '0':'4')
ismember('1236', ['0':'4', '6':'7'])
Jhon Rackham
on 16 Sep 2019
Answers (0)
Categories
Find more on Mathematics in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

