@Tw1ce

Как преобразовать (cast) void* в byte[][] в C++?

Есть мультизадачная структура и в одном из ее полей передается указатель на дополнительные данные для конкретного режима, в одном из таких режимов необходима легенда - заранее определенный массив byte[][2]. Режим по сути индексатор, а в массиве префиксы для отображения, собственно режиму необходим этот массив и общее количество элементов. Что-то мне подсказывает, что если до массива и получится достучаться, то количество элементов в нем мне надо знать заранее. Собственно, как это лучше организовать?

Еще раз суть: на руках инициализированный массив byte[][2], естественно с размером, поле структуры void*, куда можно либо весь массив этот положить, либо структуру-обертку какую, где-то в другом месте чисто по полю void* и со знанием всех типов необходимо получить оригинальный массив с размером.

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

Пример:
byte a1[][2] = {
  {0, 0},
  {0, 0}
};

byte a2[][2] = {
  {0, 0},
  {0, 0},
  {0, 0}
};

void *p = &a1;
byte a[?][2] = *(byte[?][2] *)p;
// а главное размер массива?

void *p = &a2;
// .. два массива показывают лишь то, что способ получения оригинального массива должен быть универсальным
  • Вопрос задан
  • 370 просмотров
Пригласить эксперта
Ответы на вопрос 1
@lil_Toady
Простой ответ: Никак.

void* - это совсем не то же самое что object в c# или java, это просто ссылка на какую-то область памяти, в данном случае на первый элемент массива. Какого размера объект по этой ссылке и что из себя представляет эта выделенная память нужно знать самому. Вы вполне можете сделать каст в массив int'ов или в одномерный массив, а не двухмерный - и это все будет валидным действием. Можете даже сказать что там объект какого-то класса или структуры. Это все лишь представление того как работать с указанной областью памяти.

C++ слишком низкоуровневый для подобного :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы