![]() |
Массивы в C++ for DOS
Плз, кто знает, приведите пример того, как в C++ for DOS увеличить чило элементов массива до определенной величины, т.к. заранее неизвестно сколько там будет элементов. Есть ли какнить функция для этого.
В дельфе помница была функция setsize. А в C++ for DOS чтонить есть наподобие? :idontnow: :help: |
Значит так:
1. размер массива, определенного как "int arr[100];" невозможно изменить 2. посмотри на std::vector |
Можно использовать CRT функцию realloc()
|
Можно в принципе так сделать, не уверен, что это хорошо:
//имеем изначально int* p=new int[N]; //увеличиваем длину на L int *p1=new int[N+L]; for(int i=0;i<N;i++){ p1[i]=p[i]; } p=p1; delete [] p1; Как написал Drakosha можно использовать библиотеку STL, но наверно для тебя это будет пока сложно (надо знать, что такое классы, шаблоны и с чем их едят) realloc() - судя по названию, относится просто к C, но про нее стоит прочитать в MSDN |
realloc - наверно самый простой вариант для ДОСа
std::vector CArray |
Цитата:
Лучше так: Код:
int *p = new int [size]; |
Кхмм..
Ничего не понятно :)) Вот мой код: Код:
#include <stdio.h>:idontnow: :help: |
Цитата:
|
Цитата:
:молись: |
Цитата:
Код:
#include <stdio.h> |
Делается элементарно
Проверено, Работает :) Код:
#include <stdio.h> |
Цитата:
Вопрос еще: А тут не надо удалять массив перед выходом из проги как в предыдущем примере? :idontnow: Флаг типа bool не пашет. Я оставил как было у меня. А так все ОКе. Пасибо! :claps: |
SteFF
Насколько я понимаю, удалять очень нужно, когда прога много памяти юзает. В данном случае не удаление некритично, т.к. ОС вроде сама все подчистит после завершения проги. бул в компиляторах типа Borland C++ у меня тоже не очень работал, в VS6b и бул работает :beer: |
Цитата:
:yees: И всем кто откликнулся! :contract: |
Цитата:
При выходе из проги вся занимаемая ею память автоматом очищается (если особыми финтами ты не вешаешь резидента, конечно). |
Ну как бы следуя хорошему стилю программирования... лучше все же удалить это при завершении программы, а не полагаться на ОС :))
:biggrin: |
ггг
это то же самое, что убирать в доме, который через 10 минут снесут :) |
Сначала начинающие кодеры наслушаются всяких разных вещей, проникнуться идеей, а потом... мама не горюй, что у них выходит. Один решит, что функция используется один раз и поэтому память можно не удалять, другой решит использовать эту функцию 1000 раз и... простенькое консольное приложение будет занимать в памяти столько же сколько 3dmax во время рендеринга. :ржать:
В этом примере все просто и память действительно удалять не критично. А если я этот код вынесу в отдельную функцию, напишу в main тест, посмотрю что все работает, и отдам дальше человеку, который будет ее узать. Если придерживаться мнения, что дом снесут, убирать не надо, то проблем утечки памяти не было бы в принципе. Все равно прогу когда-нибудь закроют, все и освободиться. ps: просто меня всегда учили, если выделенная тобой память не используется, то ее надо освободить, нельза пускать это на самотек. |
GOre01, не путай святое с праведным ;)
За фразу "выделенная память должна быть освобождена" я готов проголосовать двумя руками ;) Но разговор сейчас идет о том, надо ли освобождать память перед завершением программы. Это две совершенно различные вещи :) |
Не будем спорить, т.к. тема уже раскрыта. Тем более, я согласен, что в контексте этого решения память освобождать действительно не надо.
:beer: |
Строем динамический массив примерно так:
"int or anything type" *********************************** int *pAray; //pointer to dynamics array int kol; //numbers of started elements ... //kol=... must be >0 pArray=(int*)malloc(kol); //pointer for dynamics array with "kol" elements ... //kol+=.... or kol-=.... but kol>0 (int*)realloc(dArray,kol); //pointer for new location of dynamics array with "kol" elements ... free(dArray); //free allocations memory ******************************** |
народ, не изобретайте велосипедов, для этого как раз vector и есть. Конечно для упражнений можно и самому написать но в реальном коде....
Код:
#include <vector> |
НУ понеслась... :biggrin:
Я может неправильно выражусь. Я не знаю: float *vector = new float[kol]; - это статический массив? Или он динамический? Ведь если он динамический, то надо его удалить из памяти перед выходом из проги как я понял делается так: delete [] vector;. А если он статический, то он сам удалится. вот :) :biggrin: |
SteFF, не путай людей
пофиг, статический массив или динамический... при завершении программы ЛЮБАЯ память возвращается системе. |
Я никого путать и не собираюсь :biggrin:
:yees: |
Цитата:
Что значит new? Как я объясню преподу, что делает этот new? Он создает указатель типа float на чтото? Или что? Может я канечно бред написал, но я в указателях не больно-то разбираюсь... :) :idontnow: |
SteFF
new выделяет память и возвращает указатель на начало выделенной памяти. После использования памяти её обычно удаляют через delete <указаель>. |
Я извеняюсь, что влезаю в вашу милую беседу, тема которой уже закрыта, но всё же моё мнение - это юзать STL! Как сказал Бьёрн Страуструп по-поводу этого: "Не изобретайте колесо! Там где нужен изменющий размеры массив, используйте стандартный тип vector, из пространства имён std"
|
2ЕЖ, т.е. если у меня строка:
Код:
float* mas=new float[kol]:confused: PLZ, не надо говорить, мол что тут может быть непонятного.. я ведь только начинаю С изучать.. :p |
SteFF
Совершенно верно, выделяется sizeof(float)*kol байт памяти. |
Цитата:
Завтра попытаюсь сдать ;) :yees: |
| Часовой пояс GMT +4, время: 01:21. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.