Назначение аргумента void const * в функции

Я пытаюсь использовать библиотечную функцию из 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)

Спасибо!

2

Решение

constНесмотря на все усилия комитета по стандартизации сбить вас с толку, это не означает «постоянный». Это означает «только для чтения».

Объявляя его параметр как указатель наconst, эта функция заявляет, что ваши данные не будут скопированы при входе, но код функции сможет только читать, но не изменять их.

Так что просто строите свою матрицу обычным способом (неconst, поскольку вы необходимо заполнить его циклами), и передать его, уверенный, что он вернется без изменений.

Если … код функции отбрасывает конст. Который должен получить парень, который написал это, уволен в мгновение ока.

7

Другие решения

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);
2

По вопросам рекламы [email protected]