2015-10-18 2 views
0
void function(void * array, size_t itemsInArray, size_t sizeOfEachItem, int(*compare)(const void*, const void*)) 

char * array_ptr = static_cast<char*>(array); 

char * ptr1 = items_ptr; 
char * ptr2 = items_ptr + 1; 

void * array_ptr_void1 = static_cast<void*>(ptr1); 
void * array_ptr_void2 = static_cast<void*>(ptr2); 

compare(array_ptr_void1, array_ptr_void2); 

Таким образом, код, который у меня есть, в основном является тем, что я пытаюсь выполнить, но я, очевидно, не понимаю указатели void и передаю их функции сравнения. То, что я в основном хочу сделать, - это взять указатель void на массив, передав его указателю на char, чтобы я мог увеличивать его. Затем я хочу передать определенные части функции сравнения. Мне просто нужно, чтобы кто-то объяснил мне логику того, что я пытаюсь сделать, потому что я, похоже, не понимаю передачи указателей void на функцию сравнения. Я не могу изменить прототип функции. Мой вопрос не в том, чтобы увеличивать указатель на char, я понимаю эту часть, и я просто использую item_ptr и item_ptr + 1, чтобы продемонстрировать передачу определенной части массива. Последняя строка кода ломается, когда я посылаю части, которые нужно сравнить, поэтому мне нужно понять недостаток в моей логике. Благодаря!static_cast и передача указателей void C++

+0

Вы имеете дело с устаревшими интерфейсами C? –

+0

Тогда вам, вероятно, не нужны указатели void (а также необработанные массивы и необработанные указатели). Если вы пытаетесь реализовать что-то похожее на общую функцию сортировки, попробуйте смоделировать ее после 'std :: sort'. –

+0

Я не могу изменить прототип функции, поэтому мне нужно выяснить, как обращаться с данными, когда я их получаю. – user3466258

ответ

1

Как я понимаю из вашего вопроса. Существует несколько версий функций сравнения с разными именами функций, но с указателями void в качестве аргументов. Эти функции предназначены для обработки различных видов данных.

И ваша функция заключается в использовании этих функций сравнения для сравнения массивов. Я думаю, что ваша функция не завершена.

если items_ptr является тип полукокса * вы должны использовать

char * ptr1 = items_ptr; 
    char * ptr2 = items_ptr + sizeOfEachItem; 

Если я не ошибаюсь, вы перекручивание/перемещения через буферную (массив) указывает на array_ptr с помощью items_ptr.

Если это не использовать + 1 для перехода к следующему элементу, вместо этого используйте + sizeOfEachItem. Если вы хотите получить n-й элемент, используйте array_ptr + n * sizeOfEachItem

Надеюсь, это поможет.

+0

Да, ты определенно прав. Я понимаю, что у меня сейчас нет индексации на основе размера данных. Я просто использовал это, чтобы попытаться выяснить мою логику для того, чтобы наложить указатель на void, изменить его, а затем отправить его в функцию сравнения. – user3466258

+0

Существует также много чего для этой функции, мне просто нужно помочь понять часть указателя void и передать его функции сравнения. – user3466258

+0

Указатели Void обычно используются в c-стиле. С функциями C++ указатели void редко используются. void указатели могут немного перегружать функцию, немного шаблонов и немного - это отношение корабля. –

Смежные вопросы