#matlab #matlab-guide
#matlab #matlab-руководство
Вопрос:
Я использую listbox
для отображения сообщений и журналов моей программы. Чтобы добавлять строки по мере выполнения программы, я определил глобальный индекс следующим образом
function pushbutton_Callback(hObject, eventdata, handles)
global idx
%stuff
idx = idx 1;
logs_data(idx,1) = cellstr('First string');
set(handles.logs, 'String', logs_data); %Listbox
%other stuff
Используя global, я проверил, что на первой итерации (когда я нажимаю кнопку в первый раз), idx
это пустая ячейка, которую я инициализирую 1
. Я написал строку, а затем, если я снова нажму на кнопку, idx
появится 2
добавление новой строки под предыдущей. Единственная проблема заключается в том, что когда я делаю это, массив logs_data
становится вектором с пустыми ячейками, кроме той, которая была добавлена в данный момент.
Например, если я нажму на кнопку 5 раз, я хочу иметь logs_data
массив размером 5×1 со строками внутри
Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
но вместо этого я получаю это
[]
[]
[]
[]
Iteration 5
Как я могу это решить? В другом случае я мог бы использовать for
увеличивающийся idx
цикл, но поскольку здесь я нахожусь внутри обратного вызова кнопки, я не могу использовать это решение.
Комментарии:
1. В настоящее время у меня нет доступа к MatLab, поэтому я не могу предоставить вам полный ответ, тем не менее, пара подсказок: согласно опубликованному вами коду,
logs_data
не является глобальной переменной и не была объявлена какpersistent
; это означает, что при каждом обратном вызове она создается, а ее предыдущее содержимое теряется. Поскольку вы увеличиваете индекс при обращении к нему, вы получаете пустые ячейки. Каждый раз, когда вы вызываете обратный вызов, вы должны получить содержимоеlistbox
вlogs_data
(используяget
илиdot notation
), добавить новый элемент и назначить его listbox.2. Решаемая с вашим предложением. Просто добавляю
get(handles.logs,'String')
и вызываюlogs_data(:,1) = list;