Помогите разобраться
2428
23
Помогите не могу понять причину ошибки,
есть конструктор структуры:

otchot(int Priem, int Nach, int Proch)
{
int i;
*proch = new s_pol[Proch];
*nach = new s_pol[Nach];
*priem = new s_pol[Priem];
for (i = 0; i < Nach; ++i) nach[i] = new s_pol();
for (i = 0; i < Proch; ++i) proch[i]= new s_pol();
for (i = 0; i < Priem; ++i) priem[i]= new s_pol();
}
не могу понять почему все указатели ссылаются на один массив
----
s_pol - структура

помогите кто может!
snufi
ничо не понятно

напиши по-русски буквами, что собирался сделать?
snufi
*proch = new s_pol[Proch];
В этих строках нет типа указателя. Видимо это s_pol.

for (i = 0; i < Proch; ++i) proch= new s_pol();
А вот это на мой взгляд бред. Выше выделеляется массив элементов s_pol размерности Proch, с выставлением указателя proch в его начало. А потом в цикле этому указателю присваиваются адреса вновь созданных элементов. Если не считать того, что теряются адреса выделенных элементов из-за повторных присваиваний, то я просто не совсем понимаю смысла этой функции. Есть догадки, но лучше скажи чего хотел в ней сделать.
Cactus
По поводу :
for (i = 0; i < Proch; ++i) proch= new s_pol();

похоже глюк при правки текста сообщения после просмотра
не понятно куда исчезает [i] вообще во всем тексте самого сообщения в окошке редактирования все нормально, если кто знает кому сообщить об этом глюке то сообщите.

вот что есть на самом деле:

struct otchot
{
AnsiString agent, post, usl, period;
long double sum_all;
s_pol *nach[], *priem[], *proch[];
otchot *next;

otchot(int Priem, int Nach, int Proch)
{
int i;
agent = "";
post = "";
usl = "";
sum_all = 0;
period = "";
*proch = new(s_pol[Proch]);
*nach = new s_pol[Nach];
*priem = new s_pol[Priem];
next = NULL;
for (i = 0; i < Nach; ++i) nach[i] = new s_pol();
for (i = 0; i < Proch; ++i) proch[i]= new s_pol();
for (i = 0; i < Priem; ++i) priem[i]= new s_pol();
}
};

а хочется следующее:
нужна структура элементами которой являются три массива структур
массивы должны быть инициализированы, что делает конструктор структуры s_pol()
сама структура нужна для построения связного списка переменные Priem, Nach, и Proch
при создании списка не изменяются
snufi
ха так i в [ ] просто седается всегда
snufi
попробуем так
for (i = 0; i < Nach; ++i) nach[ i ] = new s_pol();
for (i = 0; i < Proch; ++i) proch[ i ]= new s_pol();
for (i = 0; i < Priem; ++i) priem[ i ]= new s_pol();
snufi
глюк только тогда когда i в [ ] без пробелов
snufi
массивы должны быть инициализированы
Инициализации (заполнения значениями) я не вижу, вижу создание только.

Я удивлен как это вообще работает.:улыб:Может я просто не понимаю.

На мой взгляд в этой строчке
*nach = new s_pol[Nach];
надо убрать к чертям звездочку. Иначе получается вообще муть: есть указатель nach, который не инициальзирован, т.е. указывает куда угодно. В указанной строчке получается, что в элемент (структуру), расположенный по адресу nach (т.е. в произвольное место, где память под элемент не выделена) заносится адрес (!) (ведь new возвращает адрес выделенной памяти) начала выделенного массива типа s_pol размерности Nach.

Если убрать звезду, то у тебя оператором new будет выделяться указанный массив, и адрес массива помещаться в указатель.

Смысла циклов for не вижу вообще, т.к. память под массивы уже выделена.

Вот такого объявления я не встречал: s_pol *nach[]. И его смысла я не понимаю (может просто знаний не хватает). Я понимаю смысл вот этого:
char *a.
И вот этого:
char *a[]={"str1", "st2", "str3"}.

глюк только тогда когда i в [ ] без пробелов
Т.е. вариант "[i]" глючит, а "[ i ]" - нет? Подобные глюки говорят обычно о неладах с памятью.
Cactus
глюк только тогда когда i в [ ] без пробелов
Мдя... Я не тормоз! :ха-ха!: О чем ты говорил, дошло только когда отправил сообщение.:улыб:
Cactus
>Инициализации (заполнения значениями) я не вижу, вижу создание только.

>Смысла циклов не вижу вообще, т.к. память под массивы уже выделена.

инициализация происходит в цикле for где s_pol() это вызов конструктора класса s_pol

>Если убрать звезду, то у тебя оператором new будет выделяться указанный массив, и адрес массива помещаться в указатель.
когда убрал * появилась ошибка компиляции, nach не леводопустимое выражение

>Вот такого объявления я не встречал: s_pol *nach[]. И его смысла я не понимаю
объявляется указатель на внешний массив, или я не прав
——————
Подскажите как тогда создать структуру где элементами будут инициализированные динамические массивы
snufi
Вот такой вариант тебя не устроит?

...
s_pol *nach, *priem, *proch;

otchot(int Priem, int Nach, int Proch)
{
...
*proch = new s_pol[Proch];
*nach = new s_pol[Nach];
*priem = new s_pol[Priem];
}
};

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

А вот этот вариант:

char *nach[], *priem[], *proch[];

У меня просто отказался компилироваться, сказав "[C++ Error] Unit1.cpp(16): E2449 Size of 'nach' is unknown or zero".

Билдером же пользуешься?
Cactus
Вот такой вариант тебя не устроит?
...
s_pol *nach, *priem, *proch;
otchot(int Priem, int Nach, int Proch)
{
...
*proch = new s_pol[Proch];
*nach = new s_pol[Nach];
*priem = new s_pol[Priem];
}
};

такой вариант пытался использовать
но возникла проблема, при таком способе в конструкторе, я почемуто в программе не могу использовать данный массив,
ошибка выдается на
priem[ i ]
и на
*(priem+i)
------
пользуюсь 5 Билдером
snufi
а хочется следующее:
нужна структура элементами которой являются три массива структур
массивы должны быть инициализированы, что делает конструктор структуры s_pol()
сама структура нужна для построения связного списка переменные Priem, Nach, и Proch
при создании списка не изменяются
Вот так это делается:
struct s_pol { };
struct otchot
{
AnsiString agent, post, usl, period;
long double sum_all;
s_pol *nach,*priem, *proch;
otchot *next;

otchot(int Priem, int Nach, int Proch)
{
int i;
agent = "";
post = "";
usl = "";
sum_all = 0;
period = "";
nach = new s_pol[ Nach ];
priem= new s_pol[ Priem ];
proch= new s_pol[ Proch ];
next = NULL;
}
};

при инициализации будет использоваться конструктор по-умолчанию s_pol()

снуфи и кактус, не обижайтесь, но почитайте для начала книжку Айры Пола "Объктно-ориентированное программирование с использованием С++", ну а потом вас ждёт г-н Страуструп. А затем можно запускать билдер, студию - что душа пожелает :-)
Все конечно красиво собственно так и было написано изначально, но возникла проблема при использовании

вот пример кода

olast->proch[ i ]->sum=Reestr->summa;

получаем ошибку:
Pointer to structure required on left side of -> or ->*

подскажите как тогда заполнить массив в данном случае?
-----
может я конечно чегото не понимаю но объявление
s_pol *proch;
объявляет указатель типа s_pol
а конструктор затем присваивать этому указателю адрес первого элемента массива
но proch просто указатель а не указатель на массив и операции типа
proch[ i ] уже недопустимы
или я не прав?
snufi
может я конечно чегото не понимаю но объявление
s_pol *proch;
объявляет указатель типа s_pol
а конструктор затем присваивать этому указателю адрес первого элемента массива
но proch просто указатель а не указатель на массив и операции типа
proch[ i ] уже недопустимы
или я не прав?
*proch==proch[0]
*(proch+1) == proch:1:
нет разницы
если будешь использовать приведённый выше код от Анонима, то проблем с разыменованием proch[ i ] -> не будет

читай умные книжки!!!
но проблема есть и никуда не исчезла ???
snufi
но проблема есть и никуда не исчезла ???
ты утомил
пробовал засунуть тот код в горячо любимый билдер?
и возникла проблема с кодом типа proch[ i ]->my_shit_head = true ?!!!

НЕ ПОВЕРЮ!
snufi
но проблема есть и никуда не исчезла ???
упс, прошу прощения...
совсем проглядел

надо разыменовывать так:
proch[ i ].shit_head = false
^-)
:ха-ха!: огромное спасибо енто именно то что надо :ха-ха!:
все работает!

Особая благодарность -- Анонимному пользователю
snufi
ВСЕГДА ПОЖАЛУЙСТА !
но Айру Пола прочти....
обязательно прочту
жаль что *Анонимный пользователь
а то с меня пиво :миг:
меня ажо на два дня с энтим массивом переклинило :ха-ха!:
Блин, забыл просто звездочки убрать в строках
nach = new s_pol[ Nach ]
и меня уже в дураки зачислили. Конечно из-за этой опечатки ничего и не работало.
snufi
снуф, и ещё бесплатный совет - массивами, тем более динамическими, для своей же безопасности лучше отвыкать пользоваться. Есь такая библиотека - STL, а там очень удобный контейнер vector - вот его и надо юзать (#include vector nach;)

кактус, никто не называл тебя дураком. с указателями в чужом коде легко облажаться. Но умение работать с ними - основная черта С программиста, тут "забыл звёздочку не прокатит" :-)
Прокатит после первой же попытки компиляции.:улыб: