Как присвоить unsigned char const * к void*?

224
02 июля 2022, 20:30

У меня не много опыта с С++, но вот, что мне нужно сделать. У меня есть метод который должен скастить unsigned char const * к void*.

void foo()
{
...
    void * sound_data = nullptr;
    get_pointer_on_sound_data(sound_data);
...
}
void get_pointer_on_sound_data(void * sound_data)
{
...
    unsigned char const *   m_pData = m_sound_destination_data.m_pData;
    sound_data = reinterpret_cast<void*>(const_cast<unsigned char*>(m_pData));
...
}

Но я получаю вот такую ошибку

error C2100: illegal indirection

Как сделать, чтоб это работало?

EDIT

Если говорить конкретно, то мне это нужно для использования в юнити на стороне C#. Я хочу так сделать, чтоб вытянуть поинтер из нативного кода на С# на для дальнейшего испльзования. Вот так выглядит апи с нативной стороны

DllExport bool stream_init_model_audio(void * native_stream_ptr, void* sound_data, long * sound_data_size);

И вот так я обращаюсь к нему на стороне C#

[DllImport(m_pluginName)]
    public static extern bool stream_init_model_audio(IntPtr native_stream_ptr, ref IntPtr sound_data, ref long sound_data_size);
    

EDIT2

Сейчас действительно не получается воспроизвести ошибку, но проблема теперь в том, что не получается получить поинтер на стороне c#, хотя вроде в дебаге видно, что присваевается.

Answer 1

Сейчас действительно не получается воспроизвести ошибку, но проблема теперь в том, что не получается получить поинтер на стороне c#, хотя вроде в дебаге видно, что присваевается.

Вы путаете указатель на указатель и указатель, void ** and void *, при передаче второго в функцию, его значение будет скопировано, а при передаче первого, будет передано значение где лежит сам указатель:

int copy(void *p_data) {
    p_data = (void *)(0xffffffff); // для теста
}
int ref(void **pp_data) {
    (*pp_data) = (void *)(0xffffffff); // для теста
}
int main() {
    void *p_data = nullptr;
    copy(p_data);
    printf("copy value is: %p\n", p_data);
    ref(&p_data);
    printf("ref value is: %p\n", p_data);
}

Тоже самое происходит при передачи ref IntPtr из c#.

C

C#

copy value is: (nil)
ref value is: 0xffffffff

P.S. Ну и немного отсебятины про то:

Как присвоить unsigned char const * к void*?

Да все просто, но немного не так, а последуем тому же примеру выше:

void test(void **const pp_data) { // or void const **pp_data
    // позволяем изменить значение на которое указывает указатель, не позволяя менять данные.
    (*pp_data) = (void *const)(0xffffffff); // Снова же добавлю: для теста
}
READ ALSO
Выбор между std::generate() и std::for_each()

Выбор между std::generate() и std::for_each()

Помогите выбрать реализацию метода из двух вариантов - calc1() и calc2():

145
Чтение файла и отправка по tcp

Чтение файла и отправка по tcp

Идея какая, я открываю файл и считываю его построчно, каждую строку я конвертирую в char вывожу на экран и отправляю при помощи send() на tcp серверФайл...

183
IPS Forum, Регистрация не в стандартную базу

IPS Forum, Регистрация не в стандартную базу

В стандарте при регистрации пользователя записывает логин пасс в MySql базу а пароль еще и шифрует, нужно сделать регистрацию в отдельную MySql базу,...

210
как реализовать оповещение клиентов об окончании оплаченного периода ? на php. Вывод в телеграм бот

как реализовать оповещение клиентов об окончании оплаченного периода ? на php. Вывод в телеграм бот

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

187