C++ 将返回void但具有整数参数的函数作为参数本身传递给另一个函数
我最近开始使用c++开发OpenCV。我对以下代码有问题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
#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滑块位置的地址
g\u滑块位置
(因此实际上您甚至不需要将其作为函数参数接收,但无论如何)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
vsposition
参数,我无法根据经验说话。我刚刚从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——这样您就可以在多个滑块中共享同一个回调。