Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массива / 25 сообщений из 29, страница 1 из 2
05.01.2006, 16:03
    #33469300
alex83_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Привет всем программиста С/C++.
Напишите плиз как правильно создавать массив массива. Динамический.

Динамический потому что заранее не знаю какого размера должен быть.

Например int mas[10][5]; не подходит, так как через переменную я не могу ему указать кол. элементов.

Вот одномерный - динамический массив int *mas=new int[kolelementov];
А как сделать двумерный?

Спасибо.
...
Рейтинг: 0 / 0
05.01.2006, 16:44
    #33469358
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int x =  10 , y =  5 ;

int * mas = new int[ x*y ];

// access ( [X][Y] )
mas[ Y*X + X ];

--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
05.01.2006, 17:12
    #33469395
alex83_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Спаисбо BlackStar. Но это по сути есть одномерный масив.

Я уже нашел, вот как:

int**tmp = new int*[SIZE];

for (int i=0; i!= SIZE; ++i)
tmp = new int[SIZE];

А вот где нашел сылка.
http://forum.sources.ru/index.php?showtopic=65902

Админы простите я не пытаюсь рекламировать что-то.
Если нужно можите удалить ссылку.
...
Рейтинг: 0 / 0
05.01.2006, 17:25
    #33469419
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Гы-гы-гы! memory leak в вашем решении. И не работает оно.

А я вот поэксперементировал с С++. Как всегда STL рулит.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <vector>
#include <stdio.h>

int main()
{
	int X =  4 , Y =  3 ;

	std::vector< std::vector<int> > 
		a( Y, std::vector<int>(X) );

	for( int y =  0 , n =  0 ; y < Y; y++ )
		for( int x =  0 ; x < X; x++ )
			a[y][x] = n++;

	for( int y =  0 ; y < Y; y++ )
		for( int x =  0 ; x < X; x++ )
			printf( "arr[%d][%d] = %d\n", y, x, a[y][x] );

	return  0 ;
}
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
05.01.2006, 18:08
    #33469475
Teem
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
А кто нибудь приведет определение динамического массива?
У BlackStar код то работает. Но почему массив динамический?
...
Рейтинг: 0 / 0
05.01.2006, 18:36
    #33469518
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Создайте вектор m x n и вспомогательный класс XY со статическими членами - размерность массива
Тогда (int) XY(x,y) == адресу в векторе. Разумеется оператор int придётся написать.
XY MyDim(100,200);

vector<double> v(MyDim.size(),0);

v[XY(1,2)] = 1;
...
...
Рейтинг: 0 / 0
05.01.2006, 18:42
    #33469525
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
TeemА кто нибудь приведет определение динамического массива?
У BlackStar код то работает. Но почему массив динамический?
Все очень просто, статический - значит размерность массива определяется на этапе
компиляции, динамический - на этапе исполнения.
...
Рейтинг: 0 / 0
05.01.2006, 19:07
    #33469553
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Облажался. Нужен ещё оператор () и тогда
v[XY(100,200)(1,2)] = 2
или v[myAddr(1,2)] = 2
...
Рейтинг: 0 / 0
05.01.2006, 20:28
    #33469631
suzum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
BlackStarА я вот поэксперементировал с С++. Как всегда STL рулит.
#include <vector>
#include <stdio.h>

int main()
{
int X = 4, Y = 3;

std::vector< std::vector<int> >
a( Y, std::vector<int>(X) );

for( int y = 0, n = 0; y < Y; y++ )
for( int x = 0; x < X; x++ )
a[y][x] = n++;

for( int y = 0; y < Y; y++ )
for( int x = 0; x < X; x++ )
printf( "arr[%d][%d] = %d\n", y, x, a[y][x] );

return 0;
}

А Си уже не рулит что ли ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
#include <alloc.h>

int main()
{
  int rows= 20 , cols= 50 , i, j;
  int **data = (int **) malloc(rows*cols*sizeof(int));

  for(i= 0 ;i<rows;i++)
    for(j= 0 ;j<cols;j++)
     {
       *((data+i)+j)=(int *) malloc(sizeof(int *));
       printf("\n%d", data[i][j]=i+j);
     }

  free(data);

        return  0 ;
}
...
Рейтинг: 0 / 0
06.01.2006, 11:50
    #33470036
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
suzum
А Си уже не рулит что ли ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
#include <alloc.h>

int main()
{
  int rows= 20 , cols= 50 , i, j;
  int **data = (int **) malloc(rows*cols*sizeof(int));

  for(i= 0 ;i<rows;i++)
    for(j= 0 ;j<cols;j++)
     {
       *((data+i)+j)=(int *) malloc(sizeof(int *));
       printf("\n%d", data[i][j]=i+j);
     }

  free(data);

        return  0 ;
}


Си конечно тоже рулит. :) Однако,
1) malloc на каждый элемент массива - не жирно будет? да и тормозно...
2) данный код будет работать только там где sizeof(int) == sizeof(int*)
3) опять таки memory leak в вашем коде, перед free(data); надо бы вписать

Код: plaintext
1.
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );

N'est-ce pas?
...
Рейтинг: 0 / 0
06.01.2006, 15:12
    #33470462
alex83_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Всё нормально, работает какая ещё утечька памяти.
Только в конце надо удалить этот массив из памяти.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int i=0, j=0;	

int**mas = new int*[5];

for (i=0; i<=5; ++i) mas =new int[10];

for(i=0;i<=5;++i)
for(j=0;j<=10;++j) mas[j]=1;

for(i=0;i<=5;++i)
{
    for(j=0;j<=10;++j)
    { 
       cout<<mas[j]; 
    }
    cout<<endl;	
}
 
...
Рейтинг: 0 / 0
06.01.2006, 15:28
    #33470490
alex83_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Ой забыл кое что. Вот ето точно работает. Только что из консоли вылиз. :)

Всё нормально, работает какая ещё утечька памяти.
Только в конце надо удалить этот массив из памяти.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int w=0, j=0;	

int**mas = new int*[5];

for (w=0; w<=5; ++w) 
  mas[w]=new int[10];

for(w=0;w<=5;++w)
  for(j=0;j<=10;++j) 
    mas[w][j]=7;//заполним матрицу.

for(w=0;w<=5;++w)
{
    for(j=0;j<=10;++j)
    { 
       cout<<mas[w][j]; 
    }
    cout<<endl;	
}
...
Рейтинг: 0 / 0
06.01.2006, 15:31
    #33470494
alex83_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Админы красавцы, я понял почему мой первый пример с ошибкой.
Потому что если писать mas[ЗДЕСЬ ЛАТИНСКАЯ И] то форум её удаляет получается ошибка.
А ещё форум по программированию. А вот так не трогает mas[w]
...
Рейтинг: 0 / 0
06.01.2006, 15:57
    #33470543
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Дружище! Попробуте обрамлят текс исходников тегами SRC и ваши волосы будут...
Когда набираете сообщение, обратите внимание на кнопочки который расположены под темой...
...
Рейтинг: 0 / 0
06.01.2006, 16:09
    #33470552
alex83_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
BlackStarДружище! Попробуте обрамлят текс исходников тегами SRC и ваши волосы будут...
Когда набираете сообщение, обратите внимание на кнопочки который расположены под темой...

Спасибо за совет.
Я про админов вшутку. Клёвый сайт!!! Как незайду, всегда помогут. :)
...
Рейтинг: 0 / 0
06.01.2006, 16:32
    #33470586
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Если уж так сильно хочется обращаться к массиву [x][y], то лучше наверное сделать так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>

int main()
{
	int rows= 3 , cols= 5 , i, j, n= 0 ;
	int** arr = new int*[ rows ];
	
	arr[ 0 ] = new int[ rows*cols ];  // выделяем память сразу под все строки
	for( i =  1 ; i < rows; i++ ) arr[i] = arr[ 0 ]+cols*i; // формируем др.указатели
	
	for( i =  0 ; i < rows; i++ )
		for( j =  0 ; j < cols; j++ )
			arr[i][j] = n++;
	for( i =  0 ; i < rows; i++ )
		for( j =  0 ; j < cols; j++ )
			std::cout << "arr[" << i << "][" << j << "] = "
				<< arr[i][j] << std::endl;

	delete arr[ 0 ]; // удалим собственно массив строк
	delete arr; // и массив указателей на строки этого массива
	return  0 ;
}

PS alex83_sql, я вас умоляю, не надо в цикле перебора массива писать <=. Просто, меньше! Иначе выход за границу массива получается. А это сильно чревато.
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
06.01.2006, 22:08
    #33470893
suzum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
BlackStarСи конечно тоже рулит. :) Однако,
1) malloc на каждый элемент массива - не жирно будет? да и тормозно...
2) данный код будет работать только там где sizeof(int) == sizeof(int*)
3) опять таки memory leak в вашем коде, перед free(data); надо бы вписать

Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );

N'est-ce pas?

Меня терзают смутные сомнения, что
Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );
приведёт к access violation...

BlackStar#include <iostream>

int main()
{
int rows=3, cols=5, i, j, n=0;
int** arr = new int*[ rows ];

arr[0] = new int[ rows*cols ]; // выделяем память сразу под все строки
for( i = 1; i < rows; i++ ) arr = arr[0]+cols*i; // формируем др.указатели

for( i = 0; i < rows; i++ )
for( j = 0; j < cols; j++ )
arr[j] = n++;
for( i = 0; i < rows; i++ )
for( j = 0; j < cols; j++ )
std::cout << "arr[" << i << "][" << j << "] = "
<< arr[j] << std::endl;

delete arr[0]; // удалим собственно массив строк
delete arr; // и массив указателей на строки этого массива
return 0;
}


К моему глубокому сожалению ни черта не понимаю в этом сипипи, поэтому вопрос к BlackStar, как к человеку серьёзному:
вот это то же самое или нет (продолжаю изучать C++ )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int main(int argc, char* argv[])
{
  int rows =  20 , cols =  50 , i, j;
  int *data = (int *)malloc(rows*cols*sizeof(int));
  int **arr_elems = (int **)malloc(rows*cols*sizeof(int *));

  for(i= 0 ; i<rows; i++)
    for(j= 0 ; j<cols; j++)
     {
      *((arr_elems+i)+j) = ((data+i)+j);
      printf("\n%d", arr_elems[i][j] = i*j);
     }

  free(arr_elems); printf("\nfree arr_elems OK"); getch();
  free(data);      printf("\nfree data OK");         getch();
  return  0 ;
}

P.S. Если что не так, то pardon (дико извиняюсь, французского не знаю и немного не в форме сегодня ).

Так трудно писАть - 10 раз, наверное, редактировал :(
...
Рейтинг: 0 / 0
07.01.2006, 12:17
    #33471109
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
suzum BlackStarСи конечно тоже рулит. :) Однако,
1) malloc на каждый элемент массива - не жирно будет? да и тормозно...
2) данный код будет работать только там где sizeof(int) == sizeof(int*)
3) опять таки memory leak в вашем коде, перед free(data); надо бы вписать

Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );

N'est-ce pas?

Меня терзают смутные сомнения, что
Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );
приведёт к access violation...

С чего бы? Вы ведь перед этим запихивали в data[n] указатель на память выданную (int *) malloc(sizeof(int *)).

suzum

К моему глубокому сожалению ни черта не понимаю в этом сипипи, поэтому вопрос к BlackStar, как к человеку серьёзному:
вот это то же самое или нет (продолжаю изучать C++ )

не совсем. вернее совсем не то :) разберем по строкам
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
int main(int argc, char* argv[])
{
  int rows =  20 , cols =  50 , i, j;
  int *data = (int *)malloc(rows*cols*sizeof(int));  // OK
  // размер arr_elems должен быть rows*sizeof(int*), т.к. он содержит
  // только указатели на строки массива
  int **arr_elems = (int **)malloc(rows*cols*sizeof(int *));

  for(i= 0 ; i<rows; i++)
    for(j= 0 ; j<cols; j++)
     {
       // таким образом нельзя, строки надо инициализировать чуть выше
      *((arr_elems+i)+j) = ((data+i)+j);
      printf("\n%d", arr_elems[i][j] = i*j);
     }

  free(arr_elems); printf("\nfree arr_elems OK"); getch();
  free(data);      printf("\nfree data OK");         getch();
  return  0 ;
}

вот окончательная версия

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
	int rows =  20 , cols =  50 , i, j;
	int *data = (int *)malloc(rows*cols*sizeof(int));
	int **arr_elems = (int **)malloc(rows*sizeof(int *));

	for( i =  0 ;  i < rows;  i++ )
		for( arr_elems[i] = data + (i*cols), j =  0 ;  j < cols;  j++ )
			printf("\n%d", arr_elems[i][j] = i*j);

	free(arr_elems); printf("\nfree arr_elems OK"); // getch();
	free(data);      printf("\nfree data OK\n");      //   getch();
	return  0 ;
}
...
Рейтинг: 0 / 0
07.01.2006, 15:20
    #33471231
suzum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
BlackStar перед free(data); надо бы вписать

Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );

N'est-ce pas?
suzumМеня терзают смутные сомнения, что
Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );
приведёт к access violation...

BlackStarС чего бы?
Сам не пойму с чего, но тем не менее именно так получаем AV (BCB 6).

BlackStarразберем по строкам
Код: plaintext
1.
2.
3.
  int *data = (int *)malloc(rows*cols*sizeof(int));  // OK
  // размер arr_elems должен быть rows*sizeof(int*), т.к. он содержит
  // только указатели на строки массива
  int **arr_elems = (int **)malloc(rows*cols*sizeof(int *));

Нет...
Код: plaintext
1.
2.
3.
  // data - это область памяти для размещения rows*cols целых чисел:
  int *data = (int *)malloc(rows*cols*sizeof(int));  
  // arr_elems - это область памяти для размещения rows*cols указателей на целое число:
  int **arr_elems = (int **)malloc(rows*cols*sizeof(int *));

BlackStarвот окончательная версия

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  int rows =  20 , cols =  50 , i, j;
  int *data = (int *)malloc(rows*cols*sizeof(int));
  int **arr_elems = (int **)malloc(rows*sizeof(int *));

  for( i =  0 ;  i < rows;  i++ )
            for( arr_elems[i] = data + (i*cols), j =  0 ;  j < cols;  j++ )
                   printf("\n%d", arr_elems[i][j] = i*j);

  free(arr_elems); printf("\nfree arr_elems OK"); 
  free(data);      printf("\nfree data OK\n");      
  return  0 ;
}


Здесь я не понял, зачем тогда вообще нужен arr_elems, если можно просто:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int main()
{
  int rows =  20 , cols =  50 , i, j;
  int *data = new int[rows*cols];

  for( i =  0 ;  i < rows;  i++ )
      for( j =  0 ;  j < cols;  j++ )
          printf("\n%d", *((data+i)+j) = i+j);

  delete(data);
  return  0 ;
}
А одномерный массив или многомерный - это как на него взглянуть...
...
Рейтинг: 0 / 0
07.01.2006, 15:29
    #33471238
Гадёныш
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
люди, зачем лезть в дебри?

вот на с

int **mas;
mas = (int **)malloc(sizeof(int)*N);

for(int i=0;i<N;i++)
mas = (int *)malloc(sizeof(int)*M);

for(int i=0;i<N;i++)
free(mas);

free(mass);


на с++

int **mas;
mas = new int*[N];
for (int i=0; i<N; i++)
mas=new int[M];

for (int i=0; i<N; i++)
delete []mas;

delete []mas;

кстати вы полностью не освобождали память, а потому мусора там буд немеряно!
...
Рейтинг: 0 / 0
07.01.2006, 15:38
    #33471243
Гадёныш
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
сори.. это таки комбинации символов, знач вы писали прально...
...
Рейтинг: 0 / 0
07.01.2006, 16:32
    #33471292
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
suzum BlackStar перед free(data); надо бы вписать

Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );

N'est-ce pas?
suzumМеня терзают смутные сомнения, что
Код: plaintext
  for( int sz = rows*cols, n =  0 ; n < sz; n++ ) free( data[n] );
приведёт к access violation...

BlackStarС чего бы?
Сам не пойму с чего, но тем не менее именно так получаем AV (BCB 6).


Ну, начнем с того что тот код просто ужасен и не выполняет своей задачи. И там стрельнуть может уже на уровне
Код: plaintext
data[i][j]=i+j

suzum

Нет...
Код: plaintext
1.
2.
3.
  // data - это область памяти для размещения rows*cols целых чисел:
  int *data = (int *)malloc(rows*cols*sizeof(int));  
  // arr_elems - это область памяти для размещения rows*cols указателей на целое число:
  int **arr_elems = (int **)malloc(rows*cols*sizeof(int *));


Масло масленное. Сначала размещаем место под даанные, а потом еще место под указатели на эти данные, и в результате к этим данным все равно по человечески (arr[x][y]) обратится не можем.

suzum
Здесь я не понял, зачем тогда вообще нужен arr_elems, если можно просто:
[ skip ]
А одномерный массив или многомерный - это как на него взглянуть...

Цель была: создать динамический многомерный массив, и видимо иметь возможность обращаться к его элементам в виде [x][y].

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

Мы хотим смоделировать подобное поведение для динамического массива. Для этого мы создаем опять таки плоский массив для размещения всех элементов (data) и массив указателей на указатели для доступа к строкам (arr_elems). Далее мы в каждый элемент этого массива (указатель на массив), прописываем указатель на некоторую область массива данных. arr_elems[0] = &data[0], arr_elems[1] = &data[50] и т.д. Это нам дает возможность адресовать данные обычным способом. arr_elems[2] дает нам адрес сотого элемента в массиве data или просто говоря начала третей строки массива. Далее применив к этому указателю [x] мы получаем 100+х элемент массива data или x'овый элемент в третей сроке. Так понятнее?

Теперь объясню почему надо сразу создавать весь массив под данные, а не отдельный malloc или new на каждую строку массива. Дело в том, что эти операции (выделения памяти) очень дороги с точки зрения производительности системы, вносят дополнительные расходы памяти и способствуют ее фрагментации. Поэтому память лучше распределять большими блоками, а уж потом с ними управляться по своему.
...
Рейтинг: 0 / 0
07.01.2006, 17:27
    #33471330
suzum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
BlackStarВ статическом массиве n-мерность это метафора, физически в памяти все это располагается как одномерный массив
Я и говорю:
suzumА одномерный массив или многомерный - это как на него взглянуть...

BlackStarТеперь объясню почему надо сразу создавать весь массив под данные, а не отдельный malloc или new на каждую строку массива.
Sorry, видимо Вы не обратили внимания:
suzumЗдесь я не понял, зачем тогда вообще нужен arr_elems, если можно просто:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int main()
{
  int rows =  20 , cols =  50 , i, j;
  int *data = new int[rows*cols];

  for( i =  0 ;  i < rows;  i++ )
      for( j =  0 ;  j < cols;  j++ )
          printf("\n%d", *((data+i)+j) = i+j);

  delete(data);
  return  0 ;
}

Здесь нет никакого отдельного malloc или new на каждую строку массива, память выделяется одним куском и за один приём.
А спрашивал я в последнем посте о другом: зачем вообще нужен предлагаемый Вами массив указателей на строки, если можно сделать как в приведённом выше примере ?
Есть область памяти, в которой будут размещены значения элементов массива; адрес этой области памяти нам известен (data). Тогда какой смысл в массиве указателей arr_elems ? Если только в том, чтобы иметь возможность обращаться к элементам массива как arr_elems [j], то Вы и сами говорите, что
BlackStarДело в том, что эти операции (выделения памяти) очень дороги с точки зрения производительности системы, вносят дополнительные расходы памяти и способствуют ее фрагментации.

PS: извините, пойду в гости (тут рядом) отмечу Рождество ;)
Буду часа через 3 - 4 (надеюсь).
...
Рейтинг: 0 / 0
07.01.2006, 18:36
    #33471374
BlackStar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
Я немного перепишу ваш пример и продемонстрирую вывод.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <stdio.h>
#include <strings.h>

int main(int argc, char* argv[])
{
	int rows =  3 , cols =  4 , i, j, n= 1 ;
	int *data = new int[ rows*cols ];
	bzero( data, rows*cols*sizeof(int) );

	for(i= 0 ; i<rows; i++)
		for( j= 0 ; j<cols; j++)
			*((data+i)+j) = n++;  // здесь не правильный доступ к массиву

	for(i= 0 ; i<rows; i++, printf("\n"))
		for( j= 0 ; j<cols; j++)
			printf( "data[%d][%d] = %d, ", i, j, data[j+j*i] );

	delete data;
	return  0 ;
}
вот вывод (явно не то, что ожидали получить)
Код: plaintext
1.
2.
3.
4.
bs@Hearse:~/prj> ./vec
data[0][0] = 1, data[0][1] = 5, data[0][2] = 9, data[0][3] = 10,
data[1][0] = 1, data[1][1] = 9, data[1][2] = 11, data[1][3] = 0,
data[2][0] = 1, data[2][1] = 10, data[2][2] = 0, data[2][3] = 0,

теперь чуть изменим код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <stdio.h>
#include <strings.h>

int main(int argc, char* argv[])
{
	int rows =  3 , cols =  4 , i, j, n= 1 ;
	int *data = new int[ rows*cols ];
	bzero( data, rows*cols*sizeof(int) );
	
	int **arr = new int*[ rows ];
	for( i =  0 ; i < rows; i++ ) arr[i] = &data[ i*cols ];

	for(i= 0 ; i<rows; i++)
		for( j= 0 ; j<cols; j++)
			*(*(arr+i)+j) = n++; // или arr[i][j] = n++;

	for(i= 0 ; i<rows; i++, printf("\n"))
		for( j= 0 ; j<cols; j++)
			printf( "arr[%d][%d] = %d, ", i, j, arr[i][j] );

	delete data;
	return  0 ;
}
вывод стал другим (тем который ожидался)
Код: plaintext
1.
2.
3.
4.
bs@Hearse:~/prj> ./vec
arr[0][0] = 1, arr[0][1] = 2, arr[0][2] = 3, arr[0][3] = 4, 
arr[1][0] = 5, arr[1][1] = 6, arr[1][2] = 7, arr[1][3] = 8, 
arr[2][0] = 9, arr[2][1] = 10, arr[2][2] = 11, arr[2][3] = 12, 

Идем дальше. Зачем нужен int** arr; Для адресации по строкам массива, т.е. ИСКЛЮЧИТЕЛЬНО ДЛЯ УДОБСТВА ЧТЕНИЯ И НАПИСАНИЯ КОДА. Это абсолютная потеря памяти. НО! Иногда на нее можно пойти ради читабельности. Проще читать arr[x][y], чем arr[ y + y*x ].

Два вызова new или malloc делаются исключительно для наглядности изложения. При желании все это переписывается следующим образом:
Код: plaintext
1.
2.
3.
4.
	int *data = (int*) new char[ rows*cols*sizeof(int) + rows*sizeof(int*)];
	bzero( data, rows*cols*sizeof(int) );
	
	int **arr = (int**)(data + rows*cols*sizeof(int));

--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
08.01.2006, 13:48
    #33471739
suzum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массива
+1.
Кстати, наблюдение: беседа с трезво мыслящим человеком, сочетаемая с умеренным употреблением спиртных напитков, чрезвычайно эффективно просветляет сознание.
И ещё: сейчас посмотрел первый пост BlackStar (как я его проглядел ?) и долго смеялся Круг замкнулся (хотя правильнее, наверное, окружность ), ответ был дан на 41-й минуте существования сего топика.
BlackStarThere Ain't No Such Thing As A Free Lunch
Это о том сыре, который в мышеловке ?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массива / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]