IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Массивы в C++ for DOS (https://www.imho.ws/showthread.php?t=103510)

SteFF 10.05.2006 10:54

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

Drakosha 10.05.2006 11:49

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

LightImage 10.05.2006 12:51

Можно использовать CRT функцию realloc()

Kvarx 10.05.2006 13:15

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

//имеем изначально
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

_Lynx_ 10.05.2006 14:03

realloc - наверно самый простой вариант для ДОСа
std::vector
CArray

GOre01 10.05.2006 15:26

Цитата:

Сообщение от 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;

код не проверял, но мысль должна быть понятна.

SteFF 10.05.2006 16:32

Кхмм..
Ничего не понятно :))
Вот мой код:
Код:

#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. После того как все элементы ввели, надо вывести их (для того, чтобы они все были перед глазами и можно было удостовериться в правильности выполнения задачи), а потом вывести ответ, является ли она (последовательность) возрастающей или нет.
:idontnow: :help:

XPEHOMETP 10.05.2006 17:11

Цитата:

SteFF:
Мне надо чтоб по ходу ввода элементов последовательности они записывались в массив.
И что, по мере ввода каждого элемента массив должен расширяться на одно значение? Это слишком круто! Такая фишка без проблем доступна только в интерпретируемых языках.

SteFF 10.05.2006 17:15

Цитата:

XPEHOMETP:
И что, по мере ввода каждого элемента массив должен расширяться на одно значение?
Ну да. типа кароче динамического массива
:молись:

GOre01 10.05.2006 17:32

Цитата:

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;
}

Как-то так.

Kvarx 10.05.2006 17:33

Делается элементарно
Проверено, Работает :)
Код:

#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();
}


SteFF 10.05.2006 18:11

Цитата:

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

Флаг типа bool не пашет. Я оставил как было у меня.
А так все ОКе.
Пасибо! :claps:

Kvarx 10.05.2006 18:53

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

бул в компиляторах типа Borland C++ у меня тоже не очень работал, в VS6b и бул работает :beer:

SteFF 10.05.2006 21:42

Цитата:

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

BorLase 11.05.2006 00:25

Цитата:

Kvarx:
Насколько я понимаю, удалять очень нужно, когда прога много памяти юзает. В данном случае не удаление некритично, т.к. ОС вроде сама все подчистит после завершения проги.
Именно
При выходе из проги вся занимаемая ею память автоматом очищается (если особыми финтами ты не вешаешь резидента, конечно).

SteFF 11.05.2006 10:53

Ну как бы следуя хорошему стилю программирования... лучше все же удалить это при завершении программы, а не полагаться на ОС :))
:biggrin:

BorLase 11.05.2006 11:03

ггг
это то же самое, что убирать в доме, который через 10 минут снесут :)

GOre01 11.05.2006 11:53

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

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

ps: просто меня всегда учили, если выделенная тобой память не используется, то ее надо освободить, нельза пускать это на самотек.

BorLase 11.05.2006 11:57

GOre01, не путай святое с праведным ;)

За фразу "выделенная память должна быть освобождена" я готов проголосовать двумя руками ;) Но разговор сейчас идет о том, надо ли освобождать память перед завершением программы. Это две совершенно различные вещи :)

GOre01 11.05.2006 12:19

Не будем спорить, т.к. тема уже раскрыта. Тем более, я согласен, что в контексте этого решения память освобождать действительно не надо.
:beer:

GGin 11.05.2006 13:58

Строем динамический массив примерно так:

"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
********************************

Drakosha 11.05.2006 14:54

народ, не изобретайте велосипедов, для этого как раз vector и есть. Конечно для упражнений можно и самому написать но в реальном коде....
Код:

#include <vector>

using namspace std;

...

vector<float> arr;
for (...) {
  arr.push_back(f);
}

for (int i = 0; i < arr.size(); ++i)
  print(arr[i]...);
...


SteFF 11.05.2006 20:55

НУ понеслась... :biggrin:
Я может неправильно выражусь. Я не знаю: float *vector = new float[kol]; - это статический массив? Или он динамический?
Ведь если он динамический, то надо его удалить из памяти перед выходом из проги как я понял делается так: delete [] vector;.
А если он статический, то он сам удалится. вот :)
:biggrin:

BorLase 12.05.2006 22:47

SteFF, не путай людей

пофиг, статический массив или динамический... при завершении программы ЛЮБАЯ память возвращается системе.

SteFF 13.05.2006 10:10

Я никого путать и не собираюсь :biggrin:
:yees:

SteFF 14.05.2006 11:39

Цитата:

GOre01:
float *vector = new float[kol]; // это наш массив
Хотел спросить еще.
Что значит new? Как я объясню преподу, что делает этот new?
Он создает указатель типа float на чтото? Или что?
Может я канечно бред написал, но я в указателях не больно-то разбираюсь... :)
:idontnow:

ЕЖ 14.05.2006 13:04

SteFF
new выделяет память и возвращает указатель на начало выделенной памяти. После использования памяти её обычно удаляют через delete <указаель>.

Rundll 14.05.2006 14:51

Я извеняюсь, что влезаю в вашу милую беседу, тема которой уже закрыта, но всё же моё мнение - это юзать STL! Как сказал Бьёрн Страуструп по-поводу этого: "Не изобретайте колесо! Там где нужен изменющий размеры массив, используйте стандартный тип vector, из пространства имён std"

SteFF 14.05.2006 16:43

2ЕЖ, т.е. если у меня строка:
Код:

float* mas=new float[kol]
То получается, что выделяется память для массива(?) из kol элементов?
:confused:
PLZ, не надо говорить, мол что тут может быть непонятного.. я ведь только начинаю С изучать.. :p

ЕЖ 14.05.2006 16:51

SteFF
Совершенно верно, выделяется sizeof(float)*kol байт памяти.

SteFF 14.05.2006 16:58

Цитата:

ЕЖ:
Совершенно верно, выделяется sizeof(float)*kol байт памяти.
Ясно :)
Завтра попытаюсь сдать ;)
:yees:


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

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