У меня не много опыта с С++, но вот, что мне нужно сделать. У меня есть метод который должен скастить 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#, хотя вроде в дебаге видно, что присваевается.
Сейчас действительно не получается воспроизвести ошибку, но проблема теперь в том, что не получается получить поинтер на стороне 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); // Снова же добавлю: для теста
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Помогите выбрать реализацию метода из двух вариантов - calc1() и calc2():
Идея какая, я открываю файл и считываю его построчно, каждую строку я конвертирую в char вывожу на экран и отправляю при помощи send() на tcp серверФайл...
В стандарте при регистрации пользователя записывает логин пасс в MySql базу а пароль еще и шифрует, нужно сделать регистрацию в отдельную MySql базу,...
не приходит в голову данная реализация, мне надо оповестить за день клиента что у него заканивается оплачиваемый период(на неделю, две недели