Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将返回void但具有整数参数的函数作为参数本身传递给另一个函数_C++_Function_Callback_Opencv_Function Parameter - Fatal编程技术网

C++ 将返回void但具有整数参数的函数作为参数本身传递给另一个函数

C++ 将返回void但具有整数参数的函数作为参数本身传递给另一个函数,c++,function,callback,opencv,function-parameter,C++,Function,Callback,Opencv,Function Parameter,我最近开始使用c++开发OpenCV。我对以下代码有问题 #include "cv.h" #include "highgui.h" int g_slider_position = 0; CvCapture* g_capture = NULL; void onTrackbarSlide(int pos) { cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, pos ); } int main( in

我最近开始使用c++开发OpenCV。我对以下代码有问题

#include "cv.h"
#include "highgui.h"
int g_slider_position = 0;
CvCapture* g_capture = NULL;

void onTrackbarSlide(int pos) {
  cvSetCaptureProperty(
    g_capture,
    CV_CAP_PROP_POS_FRAMES,
    pos
  );
}

int main( int argc, char** argv ) {
  cvNamedWindow( "Example3", CV_WINDOW_AUTOSIZE );
  g_capture = cvCreateFileCapture( "Aawaarapan.avi" );
  int frames = (int) cvGetCaptureProperty(
    g_capture,
    CV_CAP_PROP_FRAME_COUNT
  );
  if( frames!= 0 ) {
    cvCreateTrackbar(
      "Position",
      "Example3",
      &g_slider_position,
      frames,
      onTrackbarSlide //need to be call as onTrackbarSlide(g_slider_position) but gives error:invalid use of void expression 
    );
  }

  IplImage* frame;
  while(1) {
    frame = cvQueryFrame( g_capture );
    if( !frame ) break;

    cvShowImage( "Example3", frame );
    cvCreateTrackbar(
      "Position",
      "Example3",
      &g_slider_position,
      frames,
      onTrackbarSlide
    );

    char c = cvWaitKey(33);
    if( c == 27 ) break;

    ++g_slider_position;
  }

  cvReleaseCapture( &g_capture );
  cvDestroyWindow( "Example3" );
  return(0);
}
这里对函数
cvCreateTrackbar
的调用以函数作为参数

void onTrackbarSlide(内部位置)

但是当我这样调用函数时 cvCreateTrackbar( “职位”, “例3”, &g_滑块_位置, 框架, onTrackbarSlide(g_滑块位置) );`

它正在报告一个错误
错误:无效表达式的使用无效

实际上,我需要将g_滑块的位置传递给函数,以便知道滑块的位置

我的一个朋友告诉我把函数调用为

cvCreateTrackbar(
  "Position",
  "Example3",
  &g_slider_position,
  frames,
  onTrackbarSlide
);
这不会报告任何错误,但不会执行它应该执行的操作。滑块的位置是必需的

所以,我的问题是如何使用参数onTrackerSlide(使用其整数参数)调用cvCreateTracker。我希望我没有混淆


谢谢大家!

g\u滑块位置
可由您的函数访问--您无法传递它。您应该使用(来自您朋友的)代码,但传递的int是轨迹栏的id

应该是这样的:

void onTrackbarSlide(int id) {
  cvSetCaptureProperty(
    g_capture,
    CV_CAP_PROP_POS_FRAMES,
    g_slider_position
  );
}

这是C函数指针使用的问题,我假设您从未使用过

在创建轨迹栏时,您确实应该使用:

cvCreateTrackbar(
  "Position",
  "Example3",
  &g_slider_position,
  frames,
  onTrackbarSlide
);
当您拨打该电话时,您正在告诉OpenCV两条信息:

  • g\u滑块位置的地址
  • onTrackbarSlide的地址
  • 现在,当轨迹栏移动时,OpenCV将:

  • 直接修改
    g\u滑块位置
    (因此实际上您甚至不需要将其作为函数参数接收,但无论如何)
  • 调用onTrackbarSlide(g_slider_position),它可以这样做,因为它知道这两条信息
  • 如果您以您尝试的方式编写代码:

    cvCreateTrackbar(
      "Position",
      "Example3",
      &g_slider_position,
      frames,
      onTrackbarSlide(g_slider_position)
    );
    
    您在其中编写了
    onTrackbarSlide(g\u slider\u position)
    ,它变成了
    onTrackbarSlide
    的函数调用。换句话说,在试图找出要传递给
    cvCreateTrackbar
    的值时,它调用了
    onTrackbarSlide
    ,并将
    g\u slider\u position
    的当前值传递给它,希望
    onTrackbarSlide
    会返回函数指针,因为这正是它所需要的。好的,它从来没有走那么远,因为它可以在编译时告诉你,
    onTrackbarSlide
    返回了
    void
    ,而
    void
    不是
    void(*aCallbackFunction)(int)
    (这就是你指定类型“一个接受int但不返回任何内容的函数”)的方式,但我使用的是叙述式的

    至于
    id
    vs
    position
    参数,我无法根据经验说话。我刚刚从willowgarage读到的文档表明,回调函数接收的是位置,而不是id,这意味着你无法使用单个回调函数来区分滑块。我个人无论如何都不想这么做,因为这意味着我将有一个带开关的函数,而不是多个函数。多个功能(从微观上)将更有效,而且肯定更可读


    另一方面,
    cvCreateTrackbar
    确实返回一个int,它可能是该trackbar的id。但我不知道你该怎么处理它。返回值的实际含义在我刚刚阅读的文档页面上没有定义。考虑到这是一个C API,并且缺少
    bool
    类型,
    int
    可能只是一个真/假返回…

    请告诉我,您并不是这样格式化所有代码的!我希望这只是一个复制粘贴错误。确实令人困惑。如果你想通过g_slider_位置,你用onTrackbarSlide()做什么?@Mark:Reindented(pfiu)@cadetNumber 1:发帖时你应该努力一下,不可读的问题不太可能得到答案…@jay G_slider_位置应该传递给onTrackbarSlide,而onTrackbarSlide反过来又被支持传递给cvTrackbar@CadetNumber1:你应该复习一下C语言中函数和回调的指针……这怎么可能呢?在您显示的代码中,它声明在函数的正上方。如果将其移动到另一个cpp,则需要使用
    extern int g_slider_位置对其进行extern声明id是滑块的id——这样您就可以在多个滑块中共享同一个回调。