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

  • Автор темы A.D.I.D.A.S
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

A.D.I.D.A.S

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

Dr.Gigabit

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

Pete

#4
2Dr.Gigabit

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

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

Dr.Gigabit

#5
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 Посему лучше все-таки обратиться в сторону вектора.
 
B

bel_nikita

#6
Да, видно профи тут серьезные :) Можно, я свою скромную заметку вставлю ;)
А, что разве так не пойдет:
Код:
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
я если не знаешь какой размер выделять?
Код:
char* pArray2 = new char [Arr_size];
прокатит?
 
B

bel_nikita

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

????

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

bel_nikita

#10
????
Какая разница через переменную или нет? Переменная все равно содержит какое-то число, не так ли? :)
Приведенный пример, очень опасный ;) Во-первых он будет крутиться покуд не выделеться 4ГБ памяти, а... Можно долго продолжать ;)
 
P
#12
2Dr.Gigabit:
2Сразу видно, что вы С учили по книгам, а realloc вряд ли использовали
А С я думаю, знает разве что Брайан Керниган.
И Ричи тоже =)

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

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, просто от програмера эта имплементация скрыта в полном согласии с принципами ООП, удобно, но не всегда необходимо.
 
D

Dr.Gigabit

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

Я на С пишу уже давно и realloc использую достаточно часто (именно в VC++) и ни разу проблем не возникало, потому что мне известны такого рода тонкости.
Верю, но у меня точно возникали, возможно из-за реализации VC++ 6.0 - сложно сказать.


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

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

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

Guest

#14
????
опа :) теперь мой комп сгорит?
Просто никогда не пробовал использовать new с переменной. :)
Да нет, не сгорит. Просто за такое художество с работы выкинут... :(
М-да... Да вы чё тут цирк устроили?
...
- Ты Си не знаешь!
- Да нет это ты Си не знаешь!
...
Бред какой-то...
Кто знает С/С++ уже давно на RSDN сидит :D

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

Dr.Gigabit

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


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

bel_nikita

#17
Были высказаны разные точки зрения, вполне аргументированные, между прочим
Да-ааа, аргументы весомые: :)
Сразу видно, что язык С вы знаете слабо, а уже советы даете.
Сразу видно, что вы С учили по книгам, а realloc вряд ли использовали
З.Ы.: ???? - извини, коль обидел :( не я первый начал ;)
З.Ы.2: с rsdn'ом я наверное погарячился, но и в самом деле это рупор русскоговорящего С++ в инете :)
 
P
#19
2Dr.Gigabit: Еще какой аргумент, это же своего рода Священная Корова =)

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

Dr.Gigabit

#20
Еще какой аргумент, это же своего рода Священная Корова =)
Я это безо всякой иронии говорил. Кстати, раз уж отклонились от темы(думаю, автор топика разобрался в данном вопросе).
Где сейчас Демид, не знаете? А то про него у нас столько легенд ходит... Вроде, просто деньги хорошие зарабатывает, надоело в РТИ раздоблаев учить:)
 
Статус
Закрыто для дальнейших ответов.