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

  • Автор темы 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(!!! майкрософтовцы не гарантуют:o 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

Pete

Гость
#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

Pete

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

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

Dr.Gigabit

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