imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 10.05.2006, 10:54     # 1
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Question Массивы в C++ for DOS

Плз, кто знает, приведите пример того, как в C++ for DOS увеличить чило элементов массива до определенной величины, т.к. заранее неизвестно сколько там будет элементов. Есть ли какнить функция для этого.
В дельфе помница была функция setsize. А в C++ for DOS чтонить есть наподобие?

SteFF вне форума  
Старый 10.05.2006, 11:49     # 2
Drakosha
Full Member
 
Аватар для Drakosha
 
Регистрация: 16.10.2002
Адрес: ArchLinux, Internet
Сообщения: 557

Drakosha Реально крут(а)Drakosha Реально крут(а)Drakosha Реально крут(а)Drakosha Реально крут(а)
Значит так:
1. размер массива, определенного как "int arr[100];" невозможно изменить
2. посмотри на std::vector

Последний раз редактировалось Drakosha; 10.05.2006 в 11:53.
Drakosha вне форума  
Старый 10.05.2006, 12:51     # 3
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Можно использовать CRT функцию realloc()
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  
Старый 10.05.2006, 13:15     # 4
Kvarx
Member
 
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336

Kvarx Известность не заставит себя ждатьKvarx Известность не заставит себя ждать
Можно в принципе так сделать, не уверен, что это хорошо:

//имеем изначально
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
Kvarx вне форума  
Старый 10.05.2006, 14:03     # 5
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
realloc - наверно самый простой вариант для ДОСа
std::vector
CArray
_Lynx_ вне форума  
Старый 10.05.2006, 15:26     # 6
GOre01
Junior Member
 
Аватар для GOre01
 
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180

GOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царстве
Цитата:
Сообщение от Kvarx
Можно в принципе так сделать, не уверен, что это хорошо:

//имеем изначально
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
Очень долго будет код работать.
Лучше так:
Код:
int *p = new int [size];
...
int *p1 = new int[newSize];
memcpy((void*)p1, (void*)p, ((newSize>size)?size:newSize)*sizeof(int));
delete [] p;
p = p1;
size = newSize;
код не проверял, но мысль должна быть понятна.
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы!
GOre01 вне форума  
Старый 10.05.2006, 16:32     # 7
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Кхмм..
Ничего не понятно )
Вот мой код:
Код:
#include <stdio.h>
#include <conio.h>

int main()
{
 clrscr();
 int kol;  //kol-vo elementov
 printf("Number of elements: ");
 scanf("%d",&kol);
 printf("**********************\n\n");
 float tek,pred; //tek. AND pred. elements;
 int flag=1;  	 //vozrastayushaya OR not;
 for (int i=1;i<=kol;i++)
  {
   printf("Element %d: ",i);  //element numb. i;
   scanf("%f",&tek);          //get him ;)))
   if (i==1)                  //if it's the first elem-t;
    {
     pred=tek;
    }
   if (tek<pred)
    {
     flag=0;
    };
   pred=tek;
  };
 printf("-------\n");
 printf("RESULT:\n");
 if (flag==0)
  {
   printf("*Posledovatelnost ne yavlyaetsya monotonno vozrastayushei!");
  }
 else
  {
   printf("*Posledovatelnost yavlyaetsya monotonno vozrastayushei!");
  }
 getch();
 return 0;
}
Мне надо чтоб по ходу ввода элементов последовательности они записывались в массив. Но надо сначало создать этот массив с количеством элементов = kol. После того как все элементы ввели, надо вывести их (для того, чтобы они все были перед глазами и можно было удостовериться в правильности выполнения задачи), а потом вывести ответ, является ли она (последовательность) возрастающей или нет.
SteFF вне форума  
Старый 10.05.2006, 17:11     # 8
XPEHOMETP
Junior Member
 
Регистрация: 03.02.2006
Сообщения: 160

XPEHOMETP МолодецXPEHOMETP МолодецXPEHOMETP Молодец
Цитата:
SteFF:
Мне надо чтоб по ходу ввода элементов последовательности они записывались в массив.
И что, по мере ввода каждого элемента массив должен расширяться на одно значение? Это слишком круто! Такая фишка без проблем доступна только в интерпретируемых языках.
XPEHOMETP вне форума  
Старый 10.05.2006, 17:15     # 9
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Цитата:
XPEHOMETP:
И что, по мере ввода каждого элемента массив должен расширяться на одно значение?
Ну да. типа кароче динамического массива
SteFF вне форума  
Старый 10.05.2006, 17:32     # 10
GOre01
Junior Member
 
Аватар для GOre01
 
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180

GOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царстве
Цитата:
SteFF:
Мне надо чтоб по ходу ввода элементов последовательности они записывались в массив. Но надо сначало создать этот массив с количеством элементов = kol. После того как все элементы ввели, надо вывести их (для того, чтобы они все были перед глазами и можно было удостовериться в правильности выполнения задачи), а потом вывести ответ, является ли она (последовательность) возрастающей или нет.
Так причем здесь динамическое увеличение памяти? Тут просто надо заранее выделить память под kol элементов. Т.е.
Код:
#include <stdio.h>
#include <conio.h>

int main()
{
 clrscr();
 int kol;  //kol-vo elementov
 printf("Number of elements: ");
 scanf("%d",&kol);
 float *vector = new float[kol]; // это наш массив
 printf("**********************\n\n");
 float tek,pred; //tek. AND pred. elements;
 int flag=1;  	 //vozrastayushaya OR not;
 for (int i=1;i<=kol;i++)
  {
   printf("Element %d: ",i);  //element numb. i;
   scanf("%f",&tek);          //get him ;)))
   vector[i-1] = tek; // записываем его в массив
   if (i==1)                  //if it's the first elem-t;
    {
     pred=tek;
    }
   if (tek<pred)
    {
     flag=0;
    };
   pred=tek;
  };
 printf("-------\n");
 printf("RESULT:\n");
 for (int i = 0; i < kol; i++)
  printf("%lf ", vector[i]); // выводим массив
 if (flag==0)
  {
   printf("*Posledovatelnost ne yavlyaetsya monotonno vozrastayushei!");
  }
 else
  {
   printf("*Posledovatelnost yavlyaetsya monotonno vozrastayushei!");
  }
 getch();
 delete [] vector; // удаляем перед выходом.
 return 0;
}
Как-то так.
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы!
GOre01 вне форума  
Старый 10.05.2006, 17:33     # 11
Kvarx
Member
 
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336

Kvarx Известность не заставит себя ждатьKvarx Известность не заставит себя ждать
Делается элементарно
Проверено, Работает
Код:
#include <stdio.h>

void main(void){
	int kol, i;  
	printf("Number of elements: ");
	scanf("%d",&kol);
	printf("**********************\n\n");
	int* mas=new int[kol]; 
	
	bool flag=1;
	for (i=0;i<kol;i++){
		printf("Element %d: ",i+1);
		scanf("%d",&mas[i]);
		if(i!=0)
			if(mas[i-1]>=mas[i])
				flag=0;
	}

	printf("-------\n\n");

	printf("Sequence is: ");
	for(i=0;i<kol;i++)
		printf("%d ",mas[i]);

	printf("\nResult: ");
	if (!flag)
		printf("Sequence is not increasing!\n");
	else
		printf("Sequence is increasing!\n");
	getchar();
	getchar();
}
Kvarx вне форума  
Старый 10.05.2006, 18:11     # 12
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Цитата:
Kvarx:
Делается элементарно
Проверено, Работает
Пасиб! То что мне нужно!
Вопрос еще: А тут не надо удалять массив перед выходом из проги как в предыдущем примере?


Флаг типа bool не пашет. Я оставил как было у меня.
А так все ОКе.
Пасибо!
SteFF вне форума  
Старый 10.05.2006, 18:53     # 13
Kvarx
Member
 
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336

Kvarx Известность не заставит себя ждатьKvarx Известность не заставит себя ждать
SteFF
Насколько я понимаю, удалять очень нужно, когда прога много памяти юзает. В данном случае не удаление некритично, т.к. ОС вроде сама все подчистит после завершения проги.

бул в компиляторах типа Borland C++ у меня тоже не очень работал, в VS6b и бул работает
Kvarx вне форума  
Старый 10.05.2006, 21:42     # 14
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Цитата:
Kvarx:
Насколько я понимаю, удалять очень нужно, когда прога много памяти юзает. В данном случае не удаление некритично, т.к. ОС вроде сама все подчистит после завершения проги.
Пасиб! Большой пасиб тебе )

И всем кто откликнулся!
SteFF вне форума  
Старый 11.05.2006, 00:25     # 15
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

BorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех Гуру
Цитата:
Kvarx:
Насколько я понимаю, удалять очень нужно, когда прога много памяти юзает. В данном случае не удаление некритично, т.к. ОС вроде сама все подчистит после завершения проги.
Именно
При выходе из проги вся занимаемая ею память автоматом очищается (если особыми финтами ты не вешаешь резидента, конечно).
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.
BorLase вне форума  
Старый 11.05.2006, 10:53     # 16
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Ну как бы следуя хорошему стилю программирования... лучше все же удалить это при завершении программы, а не полагаться на ОС )
SteFF вне форума  
Старый 11.05.2006, 11:03     # 17
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

BorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех Гуру
ггг
это то же самое, что убирать в доме, который через 10 минут снесут
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.
BorLase вне форума  
Старый 11.05.2006, 11:53     # 18
GOre01
Junior Member
 
Аватар для GOre01
 
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180

GOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царстве
Сначала начинающие кодеры наслушаются всяких разных вещей, проникнуться идеей, а потом... мама не горюй, что у них выходит. Один решит, что функция используется один раз и поэтому память можно не удалять, другой решит использовать эту функцию 1000 раз и... простенькое консольное приложение будет занимать в памяти столько же сколько 3dmax во время рендеринга.

В этом примере все просто и память действительно удалять не критично. А если я этот код вынесу в отдельную функцию, напишу в main тест, посмотрю что все работает, и отдам дальше человеку, который будет ее узать. Если придерживаться мнения, что дом снесут, убирать не надо, то проблем утечки памяти не было бы в принципе. Все равно прогу когда-нибудь закроют, все и освободиться.

ps: просто меня всегда учили, если выделенная тобой память не используется, то ее надо освободить, нельза пускать это на самотек.
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы!
GOre01 вне форума  
Старый 11.05.2006, 11:57     # 19
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

BorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех Гуру
GOre01, не путай святое с праведным

За фразу "выделенная память должна быть освобождена" я готов проголосовать двумя руками Но разговор сейчас идет о том, надо ли освобождать память перед завершением программы. Это две совершенно различные вещи
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.
BorLase вне форума  
Старый 11.05.2006, 12:19     # 20
GOre01
Junior Member
 
Аватар для GOre01
 
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180

GOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царстве
Не будем спорить, т.к. тема уже раскрыта. Тем более, я согласен, что в контексте этого решения память освобождать действительно не надо.
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы!
GOre01 вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 02:56.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.