Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Как создать переопределяемый динамический массив |
Автор: Zero 6.10.2005, 20:53 | ||
В общем случае чтобы создать динамический массив, то это делается так:
А как сделать так чтобы переменную mas не заново определять, а к текущеё добавить или убрать нужное кол-во элементов. Хорошо бы если за место функции new была бы функция редактирования кол-ва элементов, как в делфи с помощью функции SetLength можно устанавливать в любой момент времени нужнок кол-во элементов. |
Автор: Mayk 6.10.2005, 21:07 | ||
использовать vector из stl.
|
Автор: Zero 6.10.2005, 21:33 |
Ето, как оно... А с массивом не как нельзя, а то я в дальшейшем планирую массив использовать с типом class |
Автор: Mayk 6.10.2005, 21:40 | ||
Афаир нет(если не рассматривать изобретение велосипедов).
А что мешает использовать вектор классов а ля vector<MyClass>? |
Автор: Zero 6.10.2005, 22:08 | ||
Блин, и чем все этот С++ расхваливают... Ничего по человечески нельзя сделать. Вот делфи тама всё просто, написал
B всё зашибись... А тут всё через ж....у ![]() Ладно, буду использовать массив на 1000 элементов... Но если кто найдёт, альтернативу функции SetLength, то пишите... И именно с массивами... ![]() |
Автор: Mayk 6.10.2005, 22:14 | ||||||
А что, вектор чем-то очень сильно отличается от массива? Не так давно уже был спор на тему вектор против массива. Советую посмотреть.
млин, я тебе пример привёл
Можешь realloc юзать, но это си(и соотсно malloc/free вместо new/delete), а не плюсы, и при использовании его в плюсах могут быть серьезные проблемы(operator = и всё такое) ps. я так и не понял почему vector<Class> не подходит, а Class [] подходит. |
Автор: Zero 6.10.2005, 22:26 |
Ладно, буду делать с векторами... ![]() |
Автор: Helicopterr 6.10.2005, 22:32 |
сперва почитай, потом делай выводы, всё не так уж и "нахрен" |
Автор: Mayk 6.10.2005, 22:41 | ||||||||||||
Кто? Где? делают помойку? Нет никакой помойки. Как бы ни было язык С++ не могут любить за то, что он походит на делфи. Это я к
Дельфи - это дельфи. С++ - это С++. Хвалить язык за похожесть на другой по крайне мере не разумно. По крайне мере в контексте с/паскаль.
"К проклятьям не прибегну и сдержусь" (с) Просто посоветую выбирать выражения.
По-моему это гораздо лучше, чем не зная языка кричать "язык - ацтой, в нем setsize'а нет". |
Автор: bel_nikita 6.10.2005, 22:57 | ||||
![]()
А чего тогда из Делфи в этот С++ лезешь? ![]() ![]()
З.Ы.: http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=c70f0beafd0ec4e7f038cb2be405ccca&search_in=posts&result_type=topics&highlite=%E4%E8%ED%E0%EC%E8%F7%E5%F1%EA%E8%E9+%EC%E0%F1%F1%E8%E2 З.Ы.Ы.: тему в мусорку |
Автор: Neitron 7.10.2005, 09:39 | ||
Блин чо реально было спор вектор vs массив? Вектор и есть массив.!!!! Он практически ничем не отличается от массива. Если судить по свойсвам. Свойсва массива в том что все элементы расположены друг за другом.
У тебя ничего не сотрется. Стирается после выполнения delete У тебя mas будет указывать уже на новую память. И ПРОИЗОЙДЕТ УТЕЧ КА ПАМЯТИ. Си всегда рвал Дельфи как шарик грелку. Я не помню чтобы хоть один нормальный проект писали на дельфях. |
Автор: Mayk 7.10.2005, 09:51 | ||||
http://forum.vingrad.ru/index.php?showtopic=65661&view=all&hl=vector вот здесь немного было. Совсем чуть-чуть, но было.
Хех, не советую говорить подобное в разделе по дельфи. Уверен, у них подготовлена бумажка, на которой записаны названия программ написанных на дельфях. ![]() |
Автор: Neitron 7.10.2005, 12:25 | ||
ГЫыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы=) |
Автор: En_t_end 7.10.2005, 12:47 | ||||||
Mayk
Не вижу проблем. Перевыделение или добавление памяти под массив - это нормальная практика... кстати в тестах по С++, бывает проскакивает такой вопрос. Zero
Дело в том, что этот SetLenght 100% был написан на Си, причем на основе того же realloc, но, используя скорее всего тучу лишних действий. ЗЫ товарищ Zero, если вы будете продолжать "хаять" С++, то я думаю скоро вам вообще здесь перестанут помогать. Либо критикуйте конструктивно, либо не критикуйте вовсе.
"Тама" у "васа" в "Дельфя" в "тома" и проблема, что все "така" "проста". |
Автор: Mayk 7.10.2005, 19:46 | ||||
Проблема раз - не всякий класс можно просто так взять и сдвинуть(например, к которому обращаются извне). Другой вопрос что такой класс делает в массиве, но ситуацию придумать можно. Проблема два - realloc(по Святому Стандарту) вовсе не обязан вызывать ::operator new для выделения памяти. В частности это значит, что если мы перегрузим new/delete(зачем - обсуждается в соседней ветке), то у нас будут проблемы - delete получит указатель не от new. Привет, дебагер.
Из Small C был получен C. Не знаю насчёт дельфи, но имхо он вполне мог быть написан на пасе. Менеджер памяти имхо написать на дельфях можно. Ф-ция по аллоканию памяти есть в оси. А если учесть тот факт, что существуют оси написанные на пасе, то очень вероятно предположить, что setlength мог быть написан не на си. |
Автор: Zero 7.10.2005, 23:34 | ||||
Зи товарищ En_t_end, вы не так поняли... я не хаю С++, а просто мои ожидания о нём немного меньше чем я себе представлял... Тут трудно как то и запутанно он воспринимается... Вот в делфи там я до некотрых функций дошол методом тыка, не читая литературы, а тут глюки начались с того, когда мне сказали что есть функция ShowMessage, но я как ради практики не старался её записать с учётом регистров, и пол часа до меня доходило что здесь, т.е. С++ чувствительный к регистру... Учить начал, чисто из-за того что по ООП курсачи заставили делать именно на С++, а так на Делфи то я бы его часа за 3 сделал...
Неверно... Я сегодня прочитал главу про векторы, и понял их отличия: размер массива можно определять один раз, но удобен массив тем что в пошаговом режиме его можно просматривать. Размер вектора можно изменять динамически на любом шаге выполнения программы, но недостаток который я заметил, то что в пошаговом режиме он не показывает свои значения, хотя в документации, написано что работать с ним можно как с обычным массивом (но это наверно имеется ввиду чисто использование операторов, а не всё остальное) |
Автор: bel_nikita 8.10.2005, 00:21 | ||
Zero
для векторов все тоже самое, что и для динамического массива для векторов истино: &v[i] == &v[0] + i |
Автор: Earnest 8.10.2005, 16:59 | ||
Просто его надо как следует попросить. Формат просьбы зависит от используемой библиотеки. |
Автор: Void 8.10.2005, 17:08 | ||
Очень хотелось бы знать, что ты читаешь, раз там именно на такие, пардон, "различия", упор сделан. Я так и не понял, что это за вредные векторы такие, значения не показывают ![]() ![]() |
Автор: Zero 8.10.2005, 19:05 | ||||||||
Пример говориш, нужен ![]()
Добавлено @ 19:09 В Watch List заношу вот такое значение:
И там в вотч листе при выполнении этой команды показывается такое сообщение: ![]()
|
Автор: Void 8.10.2005, 19:27 |
Zero М-м... ну что ж, правда ваша, напрямую добавить в Watch List такое выражение не получается. Правда, лично я никогда не испытывал в этом необходимости, Autos в VC++ мои потребности, как правило, покрывали с лихвой. |
Автор: Zero 8.10.2005, 19:40 |
Вот и я то про что... |
Автор: Earnest 9.10.2005, 11:49 |
Zero Если у тебя STL-port 5.0, то содержимое вектора посмотреть в Watch можно так: // 10 первых элементов MyVec._M_impl._M_start,10 // число элементов MyVec._M_impl._M_finish - MyVec._M_impl._M_start и т.д. Если STL-port предыдущих версий или не port, то все то же самое, но без _M_impl. Хотя возможны варианты, в зависимости от реализации STL. Это легко посмотреть - в отладчике раскрой переменную MyVec и посмотри, что внутри. Со списками и прочими мэпами хуже, в некоторых реализациях можно заглянуть внутрь узла, в других - видны только базовые члены. Но, как уже сказал Void, в этом редко бывает необходимость. В конце концов, выведи отладочную информацию с помощью OutputDebugString (наверняка и в Борланде есть какие-нибудь команды-оболочки) |
Автор: Zero 9.10.2005, 13:02 | ||||||
![]()
|
Автор: Void 9.10.2005, 15:34 | ||||
Вектора использую направо и налево. Но чтобы приходилось контролировать в процессе отладки какой-то конкретный элемент ![]()
Настолько сомневаешься в способностях авторов реализации STL? ![]() |
Автор: Zero 9.10.2005, 18:54 | ||
![]() ![]() |
Автор: Earnest 10.10.2005, 17:09 | ||||
Проверка присваивания - это круто. Однако бывают менее тривиальные случаи, когда неплохо бы заглянуть внутрь. Я, собственно, имела в виду что-то вроде
Все это выводиться на панель output в процессе выполнения программы. Но это VC (MFC), а у Борланда могут быть другие слова. Ищи в хелпе про отладочную печать. |
Автор: ZeroDivide 26.10.2005, 09:18 |
С++ [censored34! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме], нахрен его ![]() Даёшь Delphi и Free Pascal! |
Автор: Neitron 26.10.2005, 10:23 |
С++ для умных, которым не лень разбираться. |
Автор: Лыжа 26.10.2005, 23:16 | ||
что то типо того,не коmпилил ,но маст ворк.Идея вощем ясна я думаю. |
Автор: Neitron 27.10.2005, 09:41 |
Хрень. Будет ошибка о нарушении доступа к памяти. |