Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2009, 16:47   #1
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
Вопрос Динамическая память.

Добрый день!
Никогда раньше не работал с динамической памятью. Сейчас нужно создать динамическую матрицу. Подскажите, пожалуйста, как её описать и как с ней работать (присваивать элементы, и получать значение элемента)?
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 02.05.2009, 16:50   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Какой язык?

Пример на Си:
Создаем целочисленную матрицу.
Код:
int **matr;
int M=3, N=4,i; // M - количество строк, N - количество столбцов
matr = (int**)malloc(M*sizeof(int*));
for(i=0; i<M; i++)
 matr[i] = (int*)malloc(N*sizeof(int));
Когда матрица больше не нужна, нужно освободить память:
Код:
for(i=0; i<M; i++)
 free(matr[i]);
free(matr);
Обращение к элементу такое же, как и для статичного массива - matr[i][j]
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.05.2009, 16:56   #3
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию

А на Delphi?
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 02.05.2009, 17:07   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
type
vect = array of integer;
matr = array of vect;

procedure TForm1.Button1Click(Sender: TObject);
const M=3; N=4;
var
a : matr;
i,j : integer;
begin
SetLength(a,M*sizeof(vect));
for i:=0 to M-1 do
 SetLength(a[i],N*sizeof(integer));

a[0][0] := 5;
ShowMessage(IntToStr(a[0][0]));

for i:=0 to M-1 do
 a[i] := nil;
a := nil;

end;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.05.2009, 17:08   #5
Пaвeл
Пользователь
 
Аватар для Пaвeл
 
Регистрация: 08.11.2008
Сообщений: 47
По умолчанию

Большое спасибо!
Я не знаю, как должно быть, но вы делаете всё не правильно ©
Пaвeл вне форума Ответить с цитированием
Старый 29.05.2009, 20:58   #6
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Простите за некропостерство, но не хотелось создавать новую тему, для такого избитого уже вопроса. Мне необходимо используя borland c++ написать программу для сравнения эффективности сортировок. Вроде сложного ничего нет, но проблема в том, что никак не могу создать массив с размерностью 10^5 или 10^6 элементов. Вот функция, с помощью которой я создаю:

Код:
int create (int *a,int *b, long n)
	{
	for (long i=0;i<n;i++)
		b[i]=a[i]=random(100);
	return 0;
	}
До этого были объявлены эти массивы:

int *a = new int [n];
int *b = new int [n];

Если попробовать создать массив с большим количеством элементов, программа виснет...
Может в борланде ограничение на количество используемой динамической памяти? Другие компиляторы не пробовал за неимением.
amdbodia вне форума Ответить с цитированием
Старый 29.05.2009, 21:53   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

amdbodia, проверил в BC 3.1, C++ Builder 6 и MinGW.
Создавал два динамических массива размером в 10^7 - все создается. Ничего не зависает.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.05.2009, 22:16   #8
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Sazary, попробуйте, пожалуйста, запустить у себя этот код, и введите вручную размер к примеру 10^5

Код:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip.h>
# define SWAP(A,B) {A=A^B;B=A^B;A=A^B;}


int numb, numb2;
int increment (long inc[], long size);
int  shellsed (long *a, long size);
int  shell (long *a,long size);
int create (long *a,long *b, long size);
int view (long *a, long size);
int bublesort (long *a, long size);
int manual ();
int autom ();
int oper (long n, long param);

int main()
	{
	clrscr();
	randomize();
	cout<<"\n\t(A)-automatic\t(M)-manual\n\t Your choise: ";
	char ch;
	cin>>ch;
	switch (ch)
		{
		case 'A': autom(); break;
		case 'M': manual(); break;
		default: cout<<"\n\tIncorect choise";
		}
	getch();
	return 0;
	}

int manual ()
	{
	cout<<"\n\tEnter number of elements: ";
	long n;
	cin>>n;
	oper (n,1);
	return 0;
	}
	
int autom ()
	{
	cout<<"\n\n\tFirst array, 100 elements:";
	oper (100,0);
	cout<<"\n\n\n\tSecond array, 1000 elements:";
	oper (1000,0);
	cout<<"\n\n\n\tThird array, 10000 elements:";
	oper (10000,0);
	return 0;
	}

int oper (long n, long param)
	{
	long *a = new long [n];
	long *b = new long [n];
//	long *c = new long [n];
	double start,finish,del;
	create (a,b,n);
//	clock_t start,finish;
	cout<<"\n\n\tShell's sort:";
	if (param)
		{
		cout<<"\n\nUnsorted array:\n";
		view (a,n);
		}
//	time (&start);
	start = (double) clock();
	shell (a,n);
//	time (&finish);
	finish = (double) clock();
	if (param)
		{
		cout<<"\n\nSorted array:\n";
		view (a,n);
		cout<<"\n";
		}
	cout<<"\nNumber of oper. total: "<<numb<<", Shell: "<<numb2<<", Buble: "<<numb-numb2;
	del = (double) (finish-start)/CLOCKS_PER_SEC; 
	cout<<setprecision(4)<<"  Time: "<<del<<" sec";
/*	if (param)
		view (c,n);
	cout<<"\n\tShell's sort with iterations by Robert Sedgewick:";
	time (&start);
	shellsed (c,n);
	time (&finish);
	if (param)
		view (c,n);
	cout<<"\n\tNumber of operations total: "<<numb<<", Shell: "<<numb2<<", Buble: "<<numb-numb2;
	cout<<"  Time: "<<difftime(finish,start)<<" sec";
*/
	cout<<"\n\n\tBublesort:";
	if (param)
		{
		cout<<"\n\nUnsorted array:\n";
		view (b,n);
		}
	numb=0;
//	time (&start);
	start = (double) clock();
	bublesort(b,n);
	finish = (double) clock();
//	time (&finish);
	if (param)
		{
		cout<<"\n\nSorted array:\n";
		view (b,n);
		cout<<"\n";
		}
	cout<<"\nNumber of oper. total: "<<numb;
	del = (double) (finish-start)/CLOCKS_PER_SEC;
	cout<<setw(7)<<"  Time: "<<del<<" sec";
	delete[] a;
	delete[] b;
//	delete[] c;
	return 0;
	}
	
int create (long *a,long *b, long n)
	{
	for (long i=0;i<n;i++)
		b[i]=a[i]=random(100);
	return 0;
	}

int view (long a[], long n)
	{
	for (long i=0;i<n;i++)
		cout<<a[i]<<" ";
	return 0;
	}

/*
int increment (long inc[], long size)
	{
	long p1, p2, p3, s;
	p1 = p2 = p3 = 1;
	s = -1;
	do
		{
		if (++s % 2)
			{
			inc[s] = 8*p1 - 6*p2 + 1;
			}
		else
			{
			inc[s] = 9*p1 - 9*p3 + 1;
			p2 *= 2;
			p3 *= 2;
			}
		p1 *= 2;
		}
	while(3*inc[s] < size);
	return s > 0 ? --s : 0;
	}

int shellsed (long *a,long n)
	{
	numb=0;
	long inc,i,j,a2[30],s,tmp;
	s=increment(a2,n);
	cout<<"\nIncrements: ";
	cout<<"\n";
	while (s>-1)
		{
		inc = a2[s--];
		cout<<"\tInc= "<<inc;
		for (i=0;i<(n-inc-1);i++)
			{
			if (a[i]>a[i+inc])
				{
				SWAP (a[i],a[i+inc]);
				numb++;
				}
			}
		}
	cout<<"\n\n";
	numb2=numb;
	bublesort(a,n);
	return 0;
	}
*/

int shell (long *a, long n)
	{
	numb=0;
	long inc, i, j;
	inc=n/2;
	while (inc>=1)
		{
//		cout<<"\tInc= "<<inc;
		for (i=0;i<(n-inc-1);i++)
			{
			if (a[i]>a[i+inc])
				{
				SWAP (a[i],a[i+inc]);
				numb++;
				}
			}
		inc/=2;
		}
//	cout<<"\n\n";
	numb2=numb;
	bublesort(a,n);
	return 0;
	}

int bublesort (long *a, long n)
	{
	long i,j,s;
	for (i=n;i>0;i--)	
		{
		s=0;
		for (j=0;j<i;j++)
			{
			if (a[j]>a[j+1])
				{
				SWAP (a[j],a[j+1]);
				s++; numb++;
				}
			}
		if (!s)
			return 0;
		}
	return 0;
	}
amdbodia вне форума Ответить с цитированием
Старый 29.05.2009, 22:31   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Действительно встает в функции вывода.
Притом если вставить задержку после вывода определенного количества элементов, то работает.
Да и вообще, если убрать вывод элементов, то все работает.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 00:38   #10
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Код:
type
vect = array of integer;
matr = array of vect;

procedure TForm1.Button1Click(Sender: TObject);
const M=3; N=4;
var
a : matr;
i,j : integer;
begin
SetLength(a,M*sizeof(vect));
for i:=0 to M-1 do
 SetLength(a[i],N*sizeof(integer));

a[0][0] := 5;
ShowMessage(IntToStr(a[0][0]));

for i:=0 to M-1 do
 a[i] := nil;
a := nil;

end;
Так не легче будет:
Код:
var
  Mass: array of array of Integer;
begin
  SetLength(Mass, 5, 5);
А зачем M*sizeof(vect)? SetLength сама определяет сколько памети выделить.
Evgeniy26 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память liver1981 Общие вопросы C/C++ 5 22.04.2009 09:16
Динамическая память.Списки. Гвендолин Помощь студентам 6 31.03.2009 11:12
Текстовый редактор (динамическая память) quf Паскаль, Turbo Pascal, PascalABC.NET 2 21.04.2008 16:59
Динамическая память MadDog__ Помощь студентам 2 22.11.2007 00:05