динамические массивы

Тема в разделе "C и С++ FAQ", создана пользователем A.D.I.D.A.S, 12 ноя 2004.

Статус темы:
Закрыта.
  1. A.D.I.D.A.S

    A.D.I.D.A.S Гость

    Можно ли(если да, то как) увеличивать/уменьшать размер динамического массива в ходе выполнения программы?
     
  2. ????

    ???? Гость

  3. Dr.Gigabit

    Dr.Gigabit Гость

    Что вы понимаете по ходом исполнения программы?
    В рантайме нет, но скорее всего std::vector для вашей задачи подойдет
     
  4. Pete

    Pete Гость

    2Dr.Gigabit

    Как это нельзя?!?! Сразу видно, что язык С вы знаете слабо, а уже советы даете.

    2A.D.I.D.A.S посмотри про функцию realloc, изменяет размер массива, сохраняя данные в нем.
     
  5. Dr.Gigabit

    Dr.Gigabit Гость

    2 Pete

    Сразу видно, что вы С учили по книгам, а realloc вряд ли использовали
    А С я думаю, знает разве что Брайан Керниган.

    Ладно, не будем... Человеку помочь нужно, а не удовлетворять личные амбиции громкими заявлениями.
    На самом деле с realloc'ом часто возникают проблемы и использовать его сейчас крайне не рекомендуется.

    Читаем MSDN и находим там следующее
    void *realloc(
    void *memblock,
    size_t size
    );


    The size argument gives the new size of the block, in bytes. The contents of the block are unchanged up to the shorter of the new and old sizes, although the new block can be in a different location. Because the new block can be in a new memory location, the pointer returned by realloc is not guaranteed(!!! майкрософтовцы не гарантуют:eek: to be the pointer passed through the memblock argument.

    Можно, конечно, сослаться на стандарт, но, во всяком случае в VC++ 6.0 реаллок ведет себя не так, как многие от него ожидают. И c "сохранением данных в массиве" бывают проблемы:D Посему лучше все-таки обратиться в сторону вектора.
     
  6. bel_nikita

    bel_nikita Гость

    Да, видно профи тут серьезные :) Можно, я свою скромную заметку вставлю ;)
    А, что разве так не пойдет:
    Код (Text):
    char* pArray = new char [256];
    // работаем с массивом
    ...
    pArray[1] = 'a';
    ...
    // надоел нам массив, хотим новый и с большим кол-вом элементов
    char* pArray2 = new char [512];
    memcpy(pArray2,pArray,sizeof(pArray));
    delete pArray[];
    pArray = pArray;
    // дальше работаем с массивом
    pArray[257] = 'a';
    Чем такой код плох? ;)
     
  7. ????

    ???? Гость

    bel_nikita
    я если не знаешь какой размер выделять?
    Код (Text):
    char* pArray2 = new char [Arr_size];
    прокатит?
     
  8. bel_nikita

    bel_nikita Гость

    Интересно, а как вы работаете с массивом не зная его длины?
     
  9. ????

    ???? Гость

    bel_nikita
    Не, я имел в виду задание размера массива через переменную.
    Оказывается можно...
    Код (Text):
        for (int x=1;;)
           char* pArray2 = new char [x++];
    оказывается компилируется и выполняется :)
     
  10. bel_nikita

    bel_nikita Гость

    ????
    Какая разница через переменную или нет? Переменная все равно содержит какое-то число, не так ли? :)
    Приведенный пример, очень опасный ;) Во-первых он будет крутиться покуд не выделеться 4ГБ памяти, а... Можно долго продолжать ;)
     
  11. ????

    ???? Гость

    bel_nikita
    опа :) теперь мой комп сгорит?
    Просто никогда не пробовал использовать new с переменной. ;)
     
  12. Pete

    Pete Гость

    2Dr.Gigabit:
    И Ричи тоже =)

    Вы ошиблись сразу дважды =) Кто учился у Демидовича тот С не знать не может, такие отсеивались на первых курсах универа =) остальным просто выбора не оставалось.

    Because the new block can be in a new memory location, the pointer returned by realloc is not guaranteed(!!! майкрософтовцы не гарантуют:)

    Я на С пишу уже давно и realloc использую достаточно часто (именно в VC++) и ни разу проблем не возникало, потому что мне известны такого рода тонкости. Интересно, как это вообще на С пишут рабочее ПО (например Linux), если реализации не соответствую стандартам (их кстати несколько POSIX, ANSI... ), странно =)

    Я всегда учитываю это, используя возвращаемый указатель, а не передаваемый в realloc!!! И кроме того использую указатель на указатель

    int CVLIB_API ppm_read(char* filename, unsigned char** pdata, int *width, int *height, int *bpp) {
    ....
    *pdata = (unsigned char*)realloc(*pdata, size);
    ....
    }

    Для вызывающей функции изменение указателя прозрачно, кроме того передаваемый *pdata может быть равен NULL что позволяет убирать лишние проверки. Так что это тоже вариант альтернативный вашему. std::vector ведь не примитивный тип, а класс, а внутри я уверен все равно делается через new, delete и memcpy, просто от програмера эта имплементация скрыта в полном согласии с принципами ООП, удобно, но не всегда необходимо.
     
  13. Dr.Gigabit

    Dr.Gigabit Гость

    Раз вы учились у Демидовича, признаю все свои ошибки:) Я, к сожалению, его не застал, но наслышан достаточно.

    Верю, но у меня точно возникали, возможно из-за реализации VC++ 6.0 - сложно сказать.


    Мое замечание касалось только компилятора Microsoft. На других компиляторах проблем замечено не было.

    Вообщем, и это уже не только мое имхо, манипулирование битами оставим программистам на С, а для написания объектно-ориентированных программ будем использовать возможности стандартной(!) библиотеки C++;)

    ps. Кажется, вы на жабе пишете?:)
     
  14. Guest

    Guest Гость

    ????
    Да нет, не сгорит. Просто за такое художество с работы выкинут... :(
    М-да... Да вы чё тут цирк устроили?
    Бред какой-то...
    Кто знает С/С++ уже давно на RSDN сидит :D

    З.Ы.: Уж извините за резкость и за оффтоп, но смешно чессно слово
     
  15. ????

    ???? Гость

    Guest aka bel_nikita
    Что есть цирк в твоем понимании? Если простой разговор на околокомпьютеную тематику цирк, то изв. И не надо ставить себя выше других. Ведь всё знать и потестить невозможно. А сидеть где-то потому, что это модно(кульно/поиндейски...) - бред. Если что-то найти - может и обращусь (заний там достаточно), но просто провести время - невозможно (или просто мне не интересно). Очень рад, что помог тебя рассмешить.
     
  16. Dr.Gigabit

    Dr.Gigabit Гость

    Нормальный диалог, а не цирк. Были высказаны разные точки зрения, вполне аргументированные, между прочим.


    Плавали - знаем. Если вы заходите на форум, посвященный С++, то должны согласиться, что вопрос
    Можно ли(если да, то как) увеличивать/уменьшать размер динамического массива в ходе выполнения программы?
    Далеко не самый простой, который там встечается.
     
  17. bel_nikita

    bel_nikita Гость

    Да-ааа, аргументы весомые: :)
    З.Ы.: ???? - извини, коль обидел :( не я первый начал ;)
    З.Ы.2: с rsdn'ом я наверное погарячился, но и в самом деле это рупор русскоговорящего С++ в инете :)
     
  18. Dr.Gigabit

    Dr.Gigabit Гость

    Погорячились оба:) Я имел ввиду не эти аргументы... Вот Демидович - чем не агрумент? :)
     
  19. Pete

    Pete Гость

    2Dr.Gigabit: Еще какой аргумент, это же своего рода Священная Корова =)

    на чем я тока не писал ASM, C, VB, Perl, Java. Сейчас пишу в основном на Java и на С, там где каждый из них больше подходит, возможно скоро опять придется ASM вспомнить.
    З.Ы. В дискуссии по превосходству одного языка над другим стараюсь не ввязываться, т.к. глупо.
     
  20. Dr.Gigabit

    Dr.Gigabit Гость

    Я это безо всякой иронии говорил. Кстати, раз уж отклонились от темы(думаю, автор топика разобрался в данном вопросе).
    Где сейчас Демид, не знаете? А то про него у нас столько легенд ходит... Вроде, просто деньги хорошие зарабатывает, надоело в РТИ раздоблаев учить:)
     
Загрузка...
Похожие Темы - динамические массивы
  1. Rinulik
    Ответов:
    2
    Просмотров:
    1.390
  2. morpheus
    Ответов:
    0
    Просмотров:
    1.934
  3. Julia61
    Ответов:
    1
    Просмотров:
    1.228
  4. vladis222
    Ответов:
    2
    Просмотров:
    2.255
  5. Omh
    Ответов:
    9
    Просмотров:
    5.169
Статус темы:
Закрыта.

Поделиться этой страницей