Помогите не могу понять причину ошибки,
есть конструктор структуры:
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 - структура
*proch = new s_pol[Proch];
В этих строках нет типа указателя. Видимо это s_pol.
for (i = 0; i < Proch; ++i) proch= new s_pol();
А вот это на мой взгляд бред. Выше выделеляется массив элементов s_pol размерности Proch, с выставлением указателя proch в его начало. А потом в цикле этому указателю присваиваются адреса вновь созданных элементов. Если не считать того, что теряются адреса выделенных элементов из-за повторных присваиваний, то я просто не совсем понимаю смысла этой функции. Есть догадки, но лучше скажи чего хотел в ней сделать.
По поводу :
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
при создании списка не изменяются
попробуем так
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();
массивы должны быть инициализированы
Инициализации (заполнения значениями) я не вижу, вижу создание только.
Я удивлен как это вообще работает.Может я просто не понимаю.
На мой взгляд в этой строчке *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 ]" - нет? Подобные глюки говорят обычно о неладах с памятью.
>Инициализации (заполнения значениями) я не вижу, вижу создание только.
…
>Смысла циклов не вижу вообще, т.к. память под массивы уже выделена.
инициализация происходит в цикле for где s_pol() это вызов конструктора класса s_pol
>Если убрать звезду, то у тебя оператором new будет выделяться указанный массив, и адрес массива помещаться в указатель.
когда убрал * появилась ошибка компиляции, nach не леводопустимое выражение
>Вот такого объявления я не встречал: s_pol *nach[]. И его смысла я не понимаю
объявляется указатель на внешний массив, или я не прав
——————
Подскажите как тогда создать структуру где элементами будут инициализированные динамические массивы
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".
Вот такой вариант тебя не устроит?
...
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 Билдером
В ответ на: а хочется следующее:
нужна структура элементами которой являются три массива структур
массивы должны быть инициализированы, что делает конструктор структуры 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 ] уже недопустимы
или я не прав?
В ответ на: может я конечно чегото не понимаю но объявление
s_pol *proch;
объявляет указатель типа s_pol
а конструктор затем присваивать этому указателю адрес первого элемента массива
но proch просто указатель а не указатель на массив и операции типа
proch[ i ] уже недопустимы
или я не прав?
*proch==proch[0]
*(proch+1) == proch
нет разницы
если будешь использовать приведённый выше код от Анонима, то проблем с разыменованием proch[ i ] -> не будет
Блин, забыл просто звездочки убрать в строках nach = new s_pol[ Nach ]
и меня уже в дураки зачислили. Конечно из-за этой опечатки ничего и не работало.
снуф, и ещё бесплатный совет - массивами, тем более динамическими, для своей же безопасности лучше отвыкать пользоваться. Есь такая библиотека - STL, а там очень удобный контейнер vector - вот его и надо юзать (#include vector nach;)
кактус, никто не называл тебя дураком. с указателями в чужом коде легко облажаться. Но умение работать с ними - основная черта С программиста, тут "забыл звёздочку не прокатит" :-)