回调函数抛出意外的“不一致参数”错误

问题描述

我使用的是 GNU Octave,版本 4.4.1。我试图通过包含两个滑块来制作一个简单振荡器的交互式绘图,这两个滑块将允许更改初始速度和振荡器质量。 绘图本身显示良好,以及带有一个滑块(用于速度)的脚本。这是带有回调函数的脚本的一部分:

  <?PHP
    
    if (isset($_POST["submit"])) {
    
      $name = $_POST["name"];
      $email = $_POST["email"];
      $pwd = $_POST["pwd"];
      $pwdRepeat = $_POST["pwdrepeat"];
      $phone = $_POST["phone"];
      $address = $_POST["address"];
      $city = $_POST["city"];
      $value = $_POST['usertype'];
    
      require_once 'dbh.inc.PHP';
      require_once 'functions.inc.PHP';
    
    error="";
    
      if (emptyInputSignup($name,$email,$pwd,$pwdRepeat,$phone,$address,$city) !== false) {
        $error .= $emptyinput."<br>";
        ;
      }
      if (invalidEmail($email) !== false) {
         $error .= $invalidemail."<br>";
             }
      }
[all other sanitations  and checks ]

    
    if (empty($error))
{ $result=createuser($conn,$name,$city,$value);
 }
else{
echo $error; 
}   
 
if ($result==TRUE)  
{
exit(); // to prevent the display of the form // or do if condition below. 
}

   } 



    ?>
    
    <!--  other HTML necessary code  -->
    
    <form class="form" id="form" action="" method="post">
    <label>Full name</label>
    <input type="text" placeholder="Enter full name..." name="name" value="<?= $_POST['name']??'';?>">
    
    [... all the other fields....   ]

    <button type="submit" id="registerbtn" name="submit" value="submit" >Register</button>
    </form>
    
 <!--  other HTML necessary code  -->
    }

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

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,12)

endfunction

我收到一个错误

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

因为我知道 'k' 是标量而 't' 是向量(但我不确定 v0 和 m 是什么;我想是标量),所以我在函数 'x' 定义中包含了一个元素操作。 't' 大小是 1x301,所以我假设 'sqrt(k./m)' 是 0x0(如 Octave 所见)。不应该是1x1吗? 确实,当我尝试

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',12)

endfunction

我收到 ans = 0 0(对于 size(v0) 我得到 ans = 1 1)。会不会是slider定义有问题?我在最后包含了两个滑块定义:

size(m)

先谢谢你! 最好的问候,

伊戈尔

解决方法

您似乎对回调的工作原理有些误解。每当您与 uicontrol 对象交互时,关联的回调总是自动调用[至少]两个参数:第一个始终是相应 uicontrol 对象的“句柄”这触发了他的回调,第二个是触发的“事件”类型。因此,您的回调函数至少需要始终具有 callbackname( hndl,evt ) 签名,以便它可以处理默认传递给它的这两个参数。

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

如果你有一个像你这样的案例,你并不真正关心事件起源于哪里,并且你想影响(或者在这种情况下“读取”)两个现有的 uicontrols单个回调,无论哪个触发了事件,最简单的做法是让两个滑块句柄成为回调的额外参数,并简单地忽略回调中的第一个参数(即“活动句柄”)。 (事实上​​,您也已经忽略了“事件”参数!)。

这是一个例子:

%% 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',[0.45,0.50,'min',1,'max',10 );

  % Label and slider for oscillator mass
    OM_label  = uicontrol( 'style',0.125,'Oscillator Mass ' );
    OM_slider = uicontrol( 'style',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,m_init,OM_slider } );
    plot_oscillation( v0_init,m_init );
endfunction

function slider_callback (active_handle,event,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,[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,12 );
endfunction