Запутался в "указателях на указатели"

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 16:35:05

Привет, 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]'.

Объясните плз, чего я не понимаю?
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 16:44:34

массивы указтелей можно токо копировать
а не присваивать

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 17:01:06

Дык я же не массив присваиваю, а _указатель_ на массив/
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 17:03:23

и то и другое массив указателей
и вы его пытаетесь присвоить

вы в работе со строкаими тоже их присваете ??)))
про опереции strcpy и прочее слышали?

так точно и сдесь

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 17:15:57

Да! При работе со строками я тоже их присваиваю, если мне нужно два указателя в одно и тоже место.
Про strcpy слышал много интересного.
Повторюсь: мне не нужна _копия_ этого массива в другом участке памяти. Мне нужно чтобы на массив _указывало_ 2 (два) указателя. Один из которых после завершения определённых операций будет банально обнулён.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 17:21:36

вообщем говоря так будет правильно

Код: Выделить всё

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];
если так будет понятнее

а то обьяснять долго

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 17:27:21

Если бы я знал сколько элементов надо будет поместить в массив, я бы не заморачивался. Проблема как раз в неизвестности на стадии компиляции. Количество элементов будет известно в Run-time, т.к. информация загружается из пока неизвестно какого файла. А резервировать место под 10000 элементов - смерти подобно.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 17:31:46

я тебе уже сказал
массивы неважно чего указателей или каких то чисел
копируються 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];
это ты хотел?
ну или
показывай весь код

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 17:51:29

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;
...
А в Си в чём трабл?
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 17:59:02

выше смотри
я тебе уже показал

никаких проблем
посто ты или плохо знаешь делфи или плохо знаешь С++

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 18:09:36

Ты показал как копировать содержимое, которое мне трогать не надо. Его надо оставить на месте.
А языки программирования здесь ни причём. asm { mov [eax], [edx] } где eax - адрес ячейки объекта, а edx - адрес который я подставляю после знака равенства.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 18:19:06

paradox » 2009-05-17 17:31:46
читаем внимательно сообщения от этой даты

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 18:39:08

paradox, юзай ссылки. Я тему начал в 17:35. Какое сообщение в 17:31?
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 18:44:53

http://forum.lissyara.su/viewtopic.php? ... 61#p166668
я обычно ссылки не юзаю
они всравно не работают =)

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 18:57:46

У меня ссылки работают :smile:
я тебе уже сказал
массивы неважно чего указателей или каких то чисел
копируються memcpy
я тебе уже ответил
...Мне не надо массивы по памяти гонять туда-сюда ... Вопрос в том, чтобы задать указатель на массив
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-17 19:06:20

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];
...Мне не надо массивы по памяти гонять туда-сюда ... Вопрос в том, чтобы задать указатель на массив
а это по твоему что????
щас начну ругаться грязным матом

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-17 19:26:15

Я тоже! :smile:
Разобрался. Долго разбирался, т.к. непривычно.
Делается так:

Код: Выделить всё

class Child2{
int **nameofvar
}

...
Child *temp[хоть миллион]
// заполняется temp, обрезается по необходимое колво элементов и пихается
Collection->nameofvar = (int**)buf;
// соответствующим образом заполняется второй уровень массива
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов


Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение Fastman » 2009-05-18 17:10:08

За такие вещи на С++ надо сразу руки отрывать и запихивать кой куда.
Спрашивается, для чего STL придумали ????
Соблюдай принцип: чем проще - тем лучше. Юзай понятные структуры данных. Не мудри с указателями.
Для побаловаться/лабу сделать - можно. В боевом софте за такое банят больно :)
Главное в жизни здоровье и любовь, остальное я все куплю.

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-18 20:46:56

2Fastman
За "такие вещи" отрывать надо не только на Си! А вот придумаешь проще - сообщи. За ценный совет посчитаю. Спасибо скажу. А критиковать я и сам умею.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-18 20:50:45

я смысл вот этого тогда не понял
Child *temp[хоть миллион]
оно ж не используеться ))))

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-18 20:58:30

2paradox
В функции как _временный_ массив - пожалуйста. Но такую телегу цеплять к объекту, который ещё и не один будет - это расточительство!
Оно используется во время загрузки информации. Не всё. Но к объекту цепляется нужное - остальное отбрасывается free.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-18 21:11:57

ты какие то куски поприводил)
в итоге решение вообще какое то другое

я конечно общий смысл понял
но мляяяяяяя

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение Fastman » 2009-05-18 23:11:25

Я тогда прочитав вышесказанное не понял глубокого смысла.
Может тебе и кажется что мы критикуем. Это не так. Нам интересно просто для чего нужна такая архитектура.
Объясни смысл всего этого и мы подскажем. Без шуток.
Главное в жизни здоровье и любовь, остальное я все куплю.

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-19 12:02:52

Смысл следующий: есть файлик с 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.

Сейчас было занялся парсингом приведённого файла - занятие геморное. Так что пока не начал может посоветуете какой-нибудь существующий в наше время парсер...
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов