Страница 1 из 2
Запутался в "указателях на указатели"
Добавлено: 2009-05-17 16:35:05
de-signer
Привет, All!
Есть класс предок Parent от него наследник Child1 и Child2, который содержит у себя "указатель на массив указателей", если я не ошибаюсь, то запись будет следующая:
Код: Выделить всё
class Child1 : public Parent {
... // на самом деле таких как Child1 много, просто Child2 содержит коллекцию этих потомков, сам являясь потомком другому предку, который в свою очередь является потомком Parent (вот такая вот каша, но дело не в этом)
}
...
class Child2 : public Parent {
...
Parent *(*nameofvar[]);
...
}
Далее в коде:
Код: Выделить всё
...
Child2 Collection;
Child1 *temp[1];
Collection = new Child2;
temp[0] = new Child1;
Collection->nameofvar = &temp; // error: incompatible types in assignment of 'Child1* (*)[1]' to 'Parent** [0u]
...
Вроде всё логично: nameofvar - указатель на массив указателей, temp - массив указателей, &temp - указатель на массив указателей. Теперь по типам: Указатель на Parent может содержать указатель на Child1. Указателям-то какая разница куда они показывают на массив или на объект. Пробовал привести к (Parent**)nameofvar - пофиг: error: incompatible types in assignment of 'Parent**' to 'Parent** [0u]'.
Объясните плз, чего я не понимаю?
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 16:44:34
paradox
массивы указтелей можно токо копировать
а не присваивать
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:01:06
de-signer
Дык я же не массив присваиваю, а _указатель_ на массив/
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:03:23
paradox
и то и другое массив указателей
и вы его пытаетесь присвоить
вы в работе со строкаими тоже их присваете ??)))
про опереции strcpy и прочее слышали?
так точно и сдесь
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:15:57
de-signer
Да! При работе со строками я тоже их присваиваю, если мне нужно два указателя в одно и тоже место.
Про strcpy слышал много интересного.
Повторюсь: мне не нужна _копия_ этого массива в другом участке памяти. Мне нужно чтобы на массив _указывало_ 2 (два) указателя. Один из которых после завершения определённых операций будет банально обнулён.
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:21:36
paradox
вообщем говоря так будет правильно
Код: Выделить всё
class Child1 : public Parent {
... // на самом деле таких как Child1 много, просто Child2 содержит коллекцию этих потомков, сам являясь потомком другому предку, который в свою очередь является потомком Parent (вот такая вот каша, но дело не в этом)
}
...
class Child2 : public Parent {
...
-Parent *(*nameofvar[]);
+Parent *nameofvar[4]; //например 4 елемента
...
}
Код: Выделить всё
...
Child2 Collection;
Child1 *temp[1];
Collection = new Child2;
temp[0] = new Child1;
- Collection->nameofvar = &temp; // error: incompatible types in assignment of 'Child1* (*)[1]' to 'Parent** [0u]...
+ Collection->nameofvar[0] = temp[0];
если так будет понятнее
а то обьяснять долго
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:27:21
de-signer
Если бы я знал сколько элементов надо будет поместить в массив, я бы не заморачивался. Проблема как раз в неизвестности на стадии компиляции. Количество элементов будет известно в Run-time, т.к. информация загружается из пока неизвестно какого файла. А резервировать место под 10000 элементов - смерти подобно.
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:31:46
paradox
я тебе уже сказал
массивы неважно чего указателей или каких то чисел
копируються memcpy
Код: Выделить всё
class Child2 : public Parent {
...
-Parent *(*nameofvar[]);
+Parent *nameofvar;
...
}
...
Child2 Collection;
Child1 *temp[1];
Collection = new Child2;
temp[0] = new Child1;
....
temp[N] = new ChildN;
- Collection->nameofvar = &temp; // error: incompatible types in assignment of 'Child1* (*)[1]' to 'Parent** [0u]...
+ Collection->nameofvar = &temp[0];
это ты хотел?
ну или
показывай весь код
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:51:29
de-signer
memcpy - это при добавлении элемента в массив я буду вынужден создавать новый массив с количеством_элементов+1, заполнять последний элемент. а потом его как-то memcpy назад?
Весь код я уже привел (этот участок кода только начал писать), за исключением названий родителя и предка.
И потом вопрос стоит не в массиве, а в указателях. Мне не надо массивы по памяти гонять туда-сюда, теряя при этом машинное время на пустую перегонку неопределённое количество раз.
Вопрос в том, чтобы задать указатель на массив. Запасное количество элементов (хоть миллион) я могу позволить нанять себе на время чтения из файла, а вот объект должен содержать столько, сколько ему необходимо.
Никак не пойму в чём сложность реализации этого на Си?
Паскакаль всё просто как два пальца:
Код: Выделить всё
type
myarr = array [0..0] of pointer;
pmyarr = ^myarr
...
var
z : array [0..5] of pointer;
p : pmyarr;
...
z[0] := ...;
...;
p := @z;
...
А в Си в чём трабл?
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 17:59:02
paradox
выше смотри
я тебе уже показал
никаких проблем
посто ты или плохо знаешь делфи или плохо знаешь С++
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 18:09:36
de-signer
Ты показал как копировать содержимое, которое мне трогать не надо. Его надо оставить на месте.
А языки программирования здесь ни причём. asm { mov [eax], [edx] } где eax - адрес ячейки объекта, а edx - адрес который я подставляю после знака равенства.
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 18:19:06
paradox
paradox » 2009-05-17 17:31:46
читаем внимательно сообщения от этой даты
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 18:39:08
de-signer
paradox, юзай ссылки. Я тему начал в 17:35. Какое сообщение в 17:31?
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 18:44:53
paradox
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 18:57:46
de-signer
У меня ссылки работают
я тебе уже сказал
массивы неважно чего указателей или каких то чисел
копируються memcpy
я тебе уже ответил
...Мне не надо массивы по памяти гонять туда-сюда ... Вопрос в том, чтобы задать указатель на массив
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 19:06:20
paradox
class Child2 : public Parent {
...
-Parent *(*nameofvar[]);
+Parent *nameofvar;
...
}
...
Child2 Collection;
Child1 *temp[1];
Collection = new Child2;
temp[0] = new Child1;
....
temp[N] = new ChildN;
- Collection->nameofvar = &temp; // error: incompatible types in assignment of 'Child1* (*)[1]' to 'Parent** [0u]...
+ Collection->nameofvar = &temp[0];
...Мне не надо массивы по памяти гонять туда-сюда ... Вопрос в том, чтобы задать указатель на массив
а это по твоему что????
щас начну ругаться грязным матом
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 19:26:15
de-signer
Я тоже!
Разобрался. Долго разбирался, т.к. непривычно.
Делается так:
Код: Выделить всё
class Child2{
int **nameofvar
}
...
Child *temp[хоть миллион]
// заполняется temp, обрезается по необходимое колво элементов и пихается
Collection->nameofvar = (int**)buf;
// соответствующим образом заполняется второй уровень массива
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-17 19:53:26
paradox
мммда
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-18 17:10:08
Fastman
За такие вещи на
С++ надо сразу руки отрывать и запихивать кой куда.
Спрашивается, для чего STL придумали ????
Соблюдай принцип: чем проще - тем лучше. Юзай понятные структуры данных. Не мудри с указателями.
Для побаловаться/лабу сделать - можно. В боевом софте за такое банят больно

Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-18 20:46:56
de-signer
2Fastman
За "такие вещи" отрывать надо не только на Си! А вот придумаешь проще - сообщи. За ценный совет посчитаю. Спасибо скажу. А критиковать я и сам умею.
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-18 20:50:45
paradox
я смысл вот этого тогда не понял
Child *temp[хоть миллион]
оно ж не используеться ))))
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-18 20:58:30
de-signer
2paradox
В функции как _временный_ массив - пожалуйста. Но такую телегу цеплять к объекту, который ещё и не один будет - это расточительство!
Оно используется во время загрузки информации. Не всё. Но к объекту цепляется нужное - остальное отбрасывается free.
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-18 21:11:57
paradox
ты какие то куски поприводил)
в итоге решение вообще какое то другое
я конечно общий смысл понял
но мляяяяяяя
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-18 23:11:25
Fastman
Я тогда прочитав вышесказанное не понял глубокого смысла.
Может тебе и кажется что мы критикуем. Это не так. Нам интересно просто для чего нужна такая архитектура.
Объясни смысл всего этого и мы подскажем. Без шуток.
Re: Запутался в "указателях на указатели"
Добавлено: 2009-05-19 12:02:52
de-signer
Смысл следующий: есть файлик с 3D сценой. Там есть всякие объекты типа источника света, расположения камеры, различных объектов на сцене. Хотелось бы всё это прочитать в программу в виде списка объектов. Это я реализую путём создания однонаправленного списка объектов. У каждого объекта есть его тип и некоторые данные которые описывают содержимое (как например для источника света: его положение и яркость, для камеры: положение и направление объектива, для объекта: параметры материала, вертексы, фэйсы, нормали и т.д.).
Так вот у объекта есть такая штука:
Код: Выделить всё
DEF Box01 Transform {
translation 0 0 0
rotation -1 0 0 -1.571
children [ ...
И этих Чилдренов может быть несколько, но дело в том, что сами по себе эти чилдрены являются объектами, которые тоже содержат данные, например чилд Shape:
Код: Выделить всё
Shape {
appearance Appearance {
material Material {
diffuseColor 0.02353 0.5255 0.02353
}
}
geometry DEF Box01-FACES IndexedFaceSet {
ccw TRUE
solid TRUE
coord DEF Box01-COORD Coordinate { point [ ...
Получается у объекта есть "дети"-объекты с неизвестным до поры до времени количеством. Вот их-то я и решил упаковать в массив указателей. А т.к. заранее их количество неизвестно - сделать _указатель_ на этот массив указателей, который сотворится в Run-time.
Сейчас было занялся парсингом приведённого файла - занятие геморное. Так что пока не начал может посоветуете какой-нибудь существующий в наше время парсер...