Я пытаюсь использовать библиотечную функцию из VLFeat, которая призывает данные быть константой void *. Я не очень понимаю, как создать данные и затем передать их.
void vl_kmeans_init_centers_with_rand_data (VlKMeans * self, void const * data,
vl_size dimension, vl_size numData, vl_size numCenters)
Аргумент data — это тот, который бросает меня. Я попытался создать матрицу случайных данных, чтобы проверить функция кластеризации kmeans, но я не могу понять, как использовать данные. Другими словами, эта функция требует этого аргумента. Но для того, чтобы это было полезно, я должен понять, что, как приводить / создавать / загружать данные, чтобы они работали. Это означает, что мне нужно понять цель const void *
введите аргумент.
Любая помощь будет высоко оценен.
Примечание: я понимаю, что означает const, но, например, я не могу понять, как я могу итеративно строить данные const (то есть заполнить матрицу двойными циклами for)
Спасибо!
const
Несмотря на все усилия комитета по стандартизации сбить вас с толку, это не означает «постоянный». Это означает «только для чтения».
Объявляя его параметр как указатель наconst
, эта функция заявляет, что ваши данные не будут скопированы при входе, но код функции сможет только читать, но не изменять их.
Так что просто строите свою матрицу обычным способом (неconst
, поскольку вы необходимо заполнить его циклами), и передать его, уверенный, что он вернется без изменений.
Если … код функции отбрасывает конст. Который должен получить парень, который написал это, уволен в мгновение ока.
const
только означает, что vl_kmeans_init_centers_with_rand_data
не разрешается изменять эти данные. То есть вы не нужно использовать const
массив, вы можете передать «нормальный» (изменяемый). const
всегда может быть добавлено неявным преобразованием — просто не наоборот.
(Разрешено добавлять const: функция всегда может обещать не изменять объект, даже если он может быть изменен. Не разрешается удалять const: функция не может изменять объект или передавать его другой функции, которая ожидает изменяемый объект, если исходная функция получила объект под обещанием, что она не изменит объект.)
void
, когда используется как тип для указателя, означает «что угодно». То есть Вы можете преобразовать int-указатель в void-указатель, двойной указатель в void-указатель — что угодно, как вам нравится указатель на void-указатель. И причина этого заключается в том, что большую часть времени функция, принимающая аргумент void-pointer, может обрабатывать разные типы данных. В этом случае, VlKMeans
имеет члена dataType
который, вероятно, контролирует, как vl_kmeans_init_centers_with_rand_data
функция будет интерпретировать data
аргумент.
Предполагая, что, например, dataType
установлен в VL_TYPE_DOUBLE
, это должно работать:
std::vector<double> data(numData);
// fill 'data' with data
vl_kmeans_init_centers_with_rand_data(vlkMeans, &data[0], dimension, numData, numCenters);