Это проблема использования указателя на функцию C, которую, я полагаю, вы никогда не использовали.
В момент создания трекбара вы действительно должны использовать:
cvCreateTrackbar(
"Position",
"Example3",
&g_slider_position,
frames,
onTrackbarSlide
);
Когда вы делаете этот вызов, вы сообщаете OpenCV две части информации:
- адрес
g_slider_position
- адрес
onTrackbarSlide
Теперь, когда эта трекбар перемещается, OpenCV будет:
- напрямую изменять
g_slider_position
(так что вам даже не нужно получать его как параметр функции, но в любом случае) - позвоните
onTrackbarSlide(g_slider_position)
, что он может сделать, потому что знает обе части информации
Если вы напишите код так, как пытались:
cvCreateTrackbar(
"Position",
"Example3",
&g_slider_position,
frames,
onTrackbarSlide(g_slider_position)
);
Где вы написали onTrackbarSlide(g_slider_position)
, это превратилось в вызов функции onTrackbarSlide
.Другими словами, пытаясь выяснить, какие значения вы хотите передать cvCreateTrackbar
, он вызвал onTrackbarSlide
и передал ему текущее значение g_slider_position
, и надеялся, что onTrackbarSlide
вернет указатель на функцию, потому что эточто для этого нужно.ОК, он никогда не заходил так далеко, потому что он мог сказать во время компиляции, что onTrackbarSlide
вернул void
, и что void
не было void(*aCallbackFunction)(int)
(именно так вы определяете тип "функция, которая принимает intничего не возвращает "), но я использую стиль повествования ...
Что касается аргумента id
против position
, я не могу говорить по опыту.В документах, которые я только что прочитал из willowgarage, говорится, что ваш обратный вызов получает позицию, а не идентификатор, что означает, что у вас нет возможности использовать один обратный вызов для различения ползунков.Я лично не хотел бы делать это в любом случае, потому что это означает, что у меня была бы одна функция с переключателем вместо нескольких функций.Несколько функций (с микроскопической точки зрения) будут более эффективными и определенно более читабельными.
С другой стороны, cvCreateTrackbar
возвращает int, который может быть идентификатором этого трекбара.Не уверен, что ты должен делать с этим, хотя.Фактическое значение возвращаемого значения не было определено на странице документа, которую я только что прочитал.Учитывая, что это API C и ему не хватает типа bool
, int
может быть просто возвращением true / false ...