Массив массивов в качестве аргумента. Как затем извлечь инфу?

Компьютеры программирование

Делаю GUI для своей игрушки.
Хотелось бы иметь сие компактное и легко расширяемое.
Структура, если коротко, такая:
есть набор N диалогов и каждый диалог имеет некоторое количество кнопок,
для каждого диалога количество кнопок разное.

// Диалог описывается двумя(на самом деле их чуть больше) массивами:
GLfloat array1[] = {...}; // геометрия кнопок
int array2[] = {...}; // свойства кнопок

//Массив со всей инфой о диалоге:
void * array3[] = {&array1, &array2};

(Для полного счастья должен быть ещё один массив array4[],
который содержал бы ссылки на массивы с диалогами.
Номер элемента в массиве array4 соответствовал бы текущему диалогу на экране.)

//Есть некая функция, рисующая любой диалог на экране, в которую я передаю массив array3:
void func(void * array)
{
//Здесь нужно использовать данные массивов array1 и array2
//У нас есть их адреса array[0] и аrray[1]
//Как теперь нужно работать с array?
//Как извлечь всю инфу о массивах array1 и array2 ???
}

//Где-то в программе вызов:
...
func(&array3);
...

Кто что подскажет???

Примечание:
Вадим, ответ твой интересный. Попробую обязательно.
А что всё-таки с массивами?

Примечание:
Спаб за добавку!

Примечание:
С отрисовкой проблем у меня нет.
Есть маленькая компактная процедурка(OpenGL), которая отлично отрисовывает диалог на экране.

Примечание:
В текущем моменте я передаю две ссылки в функцию &array1, &array2 отрисовки диалога.
А нужно, чтобы эта передача шла через массив array3.

Примечание:
Млин, не хотелось бы скатываться на ассемблер.
Вадим, надеюсь, что в твоём методе со структурами подводных камней не будет.

Примечание:
1>.\Sourses\acm_GUI\Frame.cpp(168) : error C2664: 'Button_draw' : cannot convert parameter 1 from 'button' to 'button *'

Эта ошибка на Button_draw(dlg->buttons[i]);

Примечание:
Простое решение на асме:

void GUIDialogDraw(void * array3[])
{ GLfloat * x ;
int * p ;
void * d1;
void * d2;
d1 = array3[0];
d2 = array3[1];
_asm
{
MOV EAX, d1
MOV x, EAX
MOV EAX, d2
MOV p, EAX
}
// Далее работаем с x и p, как с псевдонимами массивов array1 и array2
...
}

Примечание:
Но как сделать без асма?

Примечание:
Майоров Павел, во спасибо!
Кажется, в прошлый раз, я забывал при приведении типов ставить звёздочку))).
Во действительно, как можно на мелочи сесть в лужу))).

Вадим, у тя лучший концепт!

Отмечу вас в кредитах)))!
Ответы:
вместо array3 сделать так
struct point
{
GLFloat x,y;
};
смотри обновленную программу. забудьте асм. тут он не нужен.
Нужно использовать приведение типов:
void * array3[] = {array1, array2};
cout << ((GLfloat*)array3[0])[1] << end;


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.