Когда вы регистрируете свой обратный вызов:
btn1->callback(
...,
&nums[i]);
Вы передаете адрес из nums[i]
в качестве аргумента обратного вызова (в отличие от самого значения). Таким образом, вам нужно интерпретировать data
как указанный адрес и разыменовать его для доступа к базовому номеру.
Это означает:
btn1->callback(
[](Fl_Widget *w, void *data) { std::cout << "Clicked on: " << *reinterpret_cast<int*>(data) << std::endl; },
&nums[i]);
«Случайные» числа, которые вы видите, не являются случайными , Они представляют точное местоположение в памяти, где находится ваш номер. Явное преобразование адреса в числовое значение - это совершенно правильный код, и это именно то, что вы сделали.