回调函数引发意外的不一致参数错误 [英] callback function throws unexpected "nonconformant arguments" error

查看:13
本文介绍了回调函数引发意外的不一致参数错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是GNU Octave 4.4.1版。我试图制作一个简单振荡器的交互图,它包括两个滑块,允许改变初始速度和振荡器质量。 剧情本身显示得很好,以及带有一个滑块的脚本(用于速度)。以下是带有回调函数脚本的一部分:

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','2pi','3pi','4pi','5pi','6pi','7pi','8pi','9pi','10pi'})
grid on;
l = legend (sprintf('v0 = %f', v0));
set (l, "fontsize", 12)

endfunction

但是,当我包括第二个滑块时

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','2pi','3pi','4pi','5pi','6pi','7pi','8pi','9pi','10pi'})
grid on;
l = legend (sprintf('v0 = %f', v0));
set (l, "fontsize", 12)

endfunction

我收到错误:

错误:titranje_ia2:产品:不一致的参数(op1为0x0,op2为1x301) 图形回调函数中的执行错误

因为我知道‘k’是标量,而‘t’是向量(但我不确定v0和m是什么;我想是标量),所以我在函数‘x’的定义中包含了一个基本运算。‘t’的大小是1x301,所以我假设‘sqrt(k./m)’是0x0(如Octave所示)。不是应该是1x1吗? 事实上,当我尝试时

size(m)
我收到ANS=0 0(对于SIZE(V0),我得到ANS=11)。会不会是滑块清晰度有问题?我在结尾处包括两个滑块定义:

%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对象交互时,关联的回调总是始终使用[至少]参数自动调用:第一个始终是触发回调的相应uicontrol对象的‘句柄’,第二个是触发的‘事件’类型。因此,您的回调函数至少需要始终具有callbackname( hndl, evt )签名,这样它才能在默认情况下处理传递给它的这两个参数。

如果需要,您可以指定要传递给回调的额外参数,但这些参数必须在回调函数内解释为第3、第4等参数(请参见下面的示例)。

如果您遇到与您的情况类似的情况,您并不真正关心事件从何而来,并且您希望在单个回调中影响(或在本例中为‘Read from’)两个现有的uicontrol,而不管是哪个触发了该事件,最简单的做法是将这两个滑块句柄都设置为回调的额外参数,并简单地忽略回调中的第一个参数(即‘活动句柄’)。(事实上,您已经忽略了‘Event’参数!)。

举个例子:

%% 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

这篇关于回调函数引发意外的不一致参数错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆