1. Спонсор публикаций Marketplace codeby. Сервис, который так долго ждали. При расчетах используем биткоин. Первый товар уже в продаже: Консультация на тему ИБ от Ondrik8

    Скрыть объявление
  2. Спонсор публикаций Marketplace codeby. Сервис, который так долго ждали. При расчетах используем биткоин. Второй товар маркетплейса: Надёжная обфускация вашей программы от PingVinich

    Скрыть объявление

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

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

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

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

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

    ???? Гость

    Репутация:
    0
  3. Dr.Gigabit

    Dr.Gigabit Гость

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

    Pete Гость

    Репутация:
    0
    2Dr.Gigabit

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

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

    Dr.Gigabit Гость

    Репутация:
    0
    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(!!! майкрософтовцы не гарантуют:o to be the pointer passed through the memblock argument.

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

    bel_nikita Гость

    Репутация:
    0
    Да, видно профи тут серьезные :) Можно, я свою скромную заметку вставлю ;)
    А, что разве так не пойдет:
    Код (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. ????

    ???? Гость

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

    bel_nikita Гость

    Репутация:
    0
    Интересно, а как вы работаете с массивом не зная его длины?
     
  9. ????

    ???? Гость

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

    bel_nikita Гость

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

    ???? Гость

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

    Pete Гость

    Репутация:
    0
    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 Гость

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

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


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

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

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

    Guest Гость

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

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

    ???? Гость

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

    Dr.Gigabit Гость

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


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

    bel_nikita Гость

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

    Dr.Gigabit Гость

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

    Pete Гость

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

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

    Dr.Gigabit Гость

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

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