−4°C
завтра: 4°C
Погода в Перми
−4°C
днем5°C
вечером6°C
завтра4°C
Подробно
 64,07
+0.1238
Курс USD ЦБ РФна 19 апреля
64,0688
+0.1238
 72,24
−0.1162
Курс EUR ЦБ РФна 19 апреля
72,2440
−0.1162
  • snufi

    Анонимный пользователь

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

    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 - структура

    помогите кто может!

  • Анонимный пользователь
    ничо не понятно

    напиши по-русски буквами, что собирался сделать?

  • Cactus

    Анонимный пользователь

    *proch = new s_pol[Proch];
    В этих строках нет типа указателя. Видимо это s_pol.

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

  • snufi

    Анонимный пользователь

    По поводу :
    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 в [ ] без пробелов

  • Cactus

    Анонимный пользователь

    массивы должны быть инициализированы
    Инициализации (заполнения значениями) я не вижу, вижу создание только.

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

    На мой взгляд в этой строчке
    *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 в [ ] без пробелов
    Мдя... Я не тормоз! :ха-ха!: О чем ты говорил, дошло только когда отправил сообщение.:улыб:

  • snufi

    Анонимный пользователь

    >Инициализации (заполнения значениями) я не вижу, вижу создание только.

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

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

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

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

  • 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];
    }
    };

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

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

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

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

    Билдером же пользуешься?

  • 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];
    }
    };

    такой вариант пытался использовать
    но возникла проблема, при таком способе в конструкторе, я почемуто в программе не могу использовать данный массив,
    ошибка выдается на
    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()

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

  • snufi

    Анонимный пользователь

    Все конечно красиво собственно так и было написано изначально, но возникла проблема при использовании

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

    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:1:
    нет разницы
    если будешь использовать приведённый выше код от Анонима, то проблем с разыменованием proch[ i ] -> не будет

    читай умные книжки!!!

  • snufi

    Анонимный пользователь

    но проблема есть и никуда не исчезла ???

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

    НЕ ПОВЕРЮ!

  • Анонимный пользователь
    В ответ на: но проблема есть и никуда не исчезла ???
    упс, прошу прощения...
    совсем проглядел

    надо разыменовывать так:
    proch[ i ].shit_head = false
    ^-)

  • snufi

    Анонимный пользователь

    :ха-ха!: огромное спасибо енто именно то что надо :ха-ха!:
    все работает!

    Особая благодарность -- Анонимному пользователю

  • Анонимный пользователь
    ВСЕГДА ПОЖАЛУЙСТА !
    но Айру Пола прочти....

  • snufi

    Анонимный пользователь

    обязательно прочту
    жаль что *Анонимный пользователь
    а то с меня пиво :миг:
    меня ажо на два дня с энтим массивом переклинило :ха-ха!:

  • Cactus

    Анонимный пользователь

    Блин, забыл просто звездочки убрать в строках
    nach = new s_pol[ Nach ]
    и меня уже в дураки зачислили. Конечно из-за этой опечатки ничего и не работало.

  • Анонимный пользователь
    снуф, и ещё бесплатный совет - массивами, тем более динамическими, для своей же безопасности лучше отвыкать пользоваться. Есь такая библиотека - STL, а там очень удобный контейнер vector - вот его и надо юзать (#include vector nach;)

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

  • Cactus

    Анонимный пользователь

    Прокатит после первой же попытки компиляции.:улыб:

Записей на странице:

Перейти в форум

Модератор: