簡體   English   中英

回調 function 拋出意外的“不一致的參數”錯誤

[英]callback function throws unexpected “nonconformant arguments” error

我正在使用 GNU Octave,版本 4.4.1。 我試圖通過包括兩個滑塊來制作一個簡單的振盪器的交互式 plot,這將允許改變初始速度和振盪器質量。 plot 本身顯示良好,以及帶有一個 slider(用於速度)的腳本。 這是帶有回調 function 的腳本的一部分:

function titranje_ia1 (hslider, event)

v0 = get ( hslider, "value" );
m = 1;
k = 1;
t = 0:0.1:30;
x = v0*sin(sqrt(k/m)*t);
axes ('position', [0.1, 0.2, 0.8, 0.75]);
h = plot ( t, x );
axis ([0 30 -11 11]);
set (h, "linewidth", 2);
set (gca, "xlabel", "t (s)", "ylabel", "x (m)", "fontsize", 12);
set (gca, 'XTick', 0:pi:10*pi)
set (gca, 'XTickLabel', {'0','\pi','2\pi','3\pi','4\pi','5\pi','6\pi','7\pi','8\pi','9\pi','10\pi'})
grid on;
l = legend (sprintf('v0 = %f', v0));
set (l, "fontsize", 12)

endfunction

但是,當我包含第二個 slider

function titranje_ia2 (hslider1, hslider2, event)

v0 = get ( hslider1, "value" );
m = get ( hslider2, "value" );
k = 1;
t = 0:0.1:30;
x = v0.*sin(sqrt(k./m).*t);
axes ('position', [0.1, 0.2, 0.8, 0.75]);
h = plot ( t, x );
axis ([0 30 -11 11]);
set (h, "linewidth", 2);
set (gca, "xlabel", "t (s)", "ylabel", "x (m)", "fontsize", 12);
set (gca, 'XTick', 0:pi:10*pi)
set (gca, 'XTickLabel', {'0','\pi','2\pi','3\pi','4\pi','5\pi','6\pi','7\pi','8\pi','9\pi','10\pi'})
grid on;
l = legend (sprintf('v0 = %f', v0));
set (l, "fontsize", 12)

endfunction

我收到一個錯誤:

錯誤:titranje_ia2:產品:不合格 arguments(op1 為 0x0,op2 為 1x301)圖形回調 function 執行錯誤

因為我知道'k'是一個標量而't'是一個向量(但我不確定 v0 和 m 是什么;我想是標量),我在 function 'x' 定義中包含了一個元素操作。 't' 大小是 1x301,所以我假設 'sqrt(k./m)' 是 0x0(如 Octave 所示)。 不應該是1x1嗎? 確實,當我嘗試

size(m)

我收到 ans = 0 0(對於 size(v0) 我得到 ans = 1 1)。 莫非是slider定義有問題? 我最后包括兩個 slider 定義:

%Definiramo ui element: 'klizac' za v0
hslider1 = uicontrol (
"style", "slider",
"units", "normalized",
"position", [0.1, 0.0, 0.8, 0.1],
"min", 1,
"max", 10,
"value", 4,
"callback", @titranje_ia2
);

%Definiramo ui element: 'klizac' za m
hslider2 = uicontrol (
"style", "slider",
"units", "normalized",
"position", [0.1, 0.05, 0.8, 0.1],
"min", 1,
"max", 10,
"value", 1,
"callback", @titranje_ia2
);

提前謝謝你,最好的問候,

伊戈爾

您似乎對回調的工作方式有點誤解。 每當您與 uicontrol object 交互時,始終使用 [至少]兩個arguments 自動調用關聯的回調:第一個始終是相應 uicontrol object 的“句柄”,第二個是觸發事件回調的類型'這被觸發了。 因此,您的回調 function 至少需要始終具有callbackname( hndl, evt )的簽名,以便它可以處理默認傳遞給它的這兩個 arguments 。

如果需要,您可以指定額外的arguments 傳遞給回調,但這些必須在回調 function 內被解釋為第 3、第 4 等等(參見下面的示例)。

如果您遇到像您這樣的情況,您並不真正關心事件的來源,並且您想在單個回調中影響(或在本例中“讀取”)兩個現有的 uicontrol,無論哪個觸發了事件,最簡單的做法是使兩個 slider 句柄成為回調的額外 arguments ,並簡單地忽略回調中的第一個參數(即“活動句柄”)。 (實際上,您也已經忽略了“事件”參數。)。

這是一個例子:

%% In file makesliders.m
function makesliders()
  % Label and slider for initial velocity
    IV_label  = uicontrol( 'style', 'text'  , 'units', 'normalized', 'position', [0.10, 0.025, 0.30, 0.075], 'string', 'Initial Velocity' );
    IV_slider = uicontrol( 'style', 'slider', 'units', 'normalized', 'position', [0.45, 0.025, 0.50, 0.075], 'min', 1, 'max', 10 );

  % Label and slider for oscillator mass
    OM_label  = uicontrol( 'style', 'text'  , 'units', 'normalized', 'position', [0.10, 0.125, 0.30, 0.075], 'string', 'Oscillator Mass ' );
    OM_slider = uicontrol( 'style', 'slider', 'units', 'normalized', 'position', [0.45, 0.125, 0.50, 0.075], 'min', 1, 'max', 10 );

  % Set callbacks and initial values to IV and OM sliders, and plot initial graph
    v0_init = 4;   m_init = 1;
    set( IV_slider, 'value', v0_init, 'callback', { @slider_callback, IV_slider, OM_slider } );
    set( OM_slider, 'value', m_init , 'callback', { @slider_callback, IV_slider, OM_slider } );
    plot_oscillation( v0_init, m_init );
endfunction

function slider_callback (active_handle, event, IV_slider, OM_slider )
    v0 = get( IV_slider, 'value' );
    m  = get( OM_slider, 'value' );
    plot_oscillation( v0, m );
endfunction

function plot_oscillation( v0, m )
    k  = 1;
    t  = 0 : 0.1 : 30;
    x = v0 * sin( sqrt( k / m ) * t );

    h = plot( t, x );   set( h  , 'linewidth', 2);
    set( gca, 'position', [0.1, 0.325, 0.85, 0.650], 'xlim', [0, 30], 'ylim', [-11, 11], 'xlabel', 't (s)', 'ylabel', 'x (m)', 'fontsize', 12, 'xtick', [0 : pi : 10 * pi], 'xticklabel', strcat( arrayfun( @num2str, 0:10, 'uniformoutput', false ), '\pi' ), 'xgrid', 'on', 'ygrid', 'on' );
    l = legend( sprintf( 'v0 = %.2f, m = %.2f', v0, m ) );   set( l, 'fontsize', 12 );
endfunction

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM