powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массива
29 сообщений из 29, показаны все 2 страниц
Динамический массива
    #33469300
alex83_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем программиста С/C++.
Напишите плиз как правильно создавать массив массива. Динамический.

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

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

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

Спасибо.
...
Рейтинг: 0 / 0
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #33469475
Teem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто нибудь приведет определение динамического массива?
У BlackStar код то работает. Но почему массив динамический?
...
Рейтинг: 0 / 0
Динамический массива
    #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
Динамический массива
    #33469525
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TeemА кто нибудь приведет определение динамического массива?
У BlackStar код то работает. Но почему массив динамический?
Все очень просто, статический - значит размерность массива определяется на этапе
компиляции, динамический - на этапе исполнения.
...
Рейтинг: 0 / 0
Динамический массива
    #33469553
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Облажался. Нужен ещё оператор () и тогда
v[XY(100,200)(1,2)] = 2
или v[myAddr(1,2)] = 2
...
Рейтинг: 0 / 0
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #33470494
alex83_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Админы красавцы, я понял почему мой первый пример с ошибкой.
Потому что если писать mas[ЗДЕСЬ ЛАТИНСКАЯ И] то форум её удаляет получается ошибка.
А ещё форум по программированию. А вот так не трогает mas[w]
...
Рейтинг: 0 / 0
Динамический массива
    #33470543
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дружище! Попробуте обрамлят текс исходников тегами SRC и ваши волосы будут...
Когда набираете сообщение, обратите внимание на кнопочки который расположены под темой...
...
Рейтинг: 0 / 0
Динамический массива
    #33470552
alex83_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackStarДружище! Попробуте обрамлят текс исходников тегами SRC и ваши волосы будут...
Когда набираете сообщение, обратите внимание на кнопочки который расположены под темой...

Спасибо за совет.
Я про админов вшутку. Клёвый сайт!!! Как незайду, всегда помогут. :)
...
Рейтинг: 0 / 0
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #33471243
Гадёныш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сори.. это таки комбинации символов, знач вы писали прально...
...
Рейтинг: 0 / 0
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #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
Динамический массива
    #33471739
suzum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1.
Кстати, наблюдение: беседа с трезво мыслящим человеком, сочетаемая с умеренным употреблением спиртных напитков, чрезвычайно эффективно просветляет сознание.
И ещё: сейчас посмотрел первый пост BlackStar (как я его проглядел ?) и долго смеялся Круг замкнулся (хотя правильнее, наверное, окружность ), ответ был дан на 41-й минуте существования сего топика.
BlackStarThere Ain't No Such Thing As A Free Lunch
Это о том сыре, который в мышеловке ?
...
Рейтинг: 0 / 0
Динамический массива
    #33471764
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suzum BlackStarThere Ain't No Such Thing As A Free Lunch
Это о том сыре, который в мышеловке ?
Нет. Это о том, что за все надо платить. ;-)
Наилучший вариант перевода на русский "Ланчей Даром Не Бывает".
Обе фразы имеют общеизвестные сокращения TANSTAAFL == ЛДНБ и произошли из романа Хайнлайна "Луна жестко стелет" (Robert A. Heinlein, "The Moon Is a Harsh Mistress"). Сильно рекомендую, если не читали.

ЗЫ Если читать , то только в переводе Щербакова , все остальное полный отстой.
...
Рейтинг: 0 / 0
Динамический массива
    #33471834
suzum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял разницы между "Бесплатный сыр бывает только в мышеловке" и "Ланчей Даром Не Бывает". Наверное, действительно надо прочитать книжку, тем более, что Хайнлайн мне нравится, хотя и прочитал я бессовестно мало - только "Пасынки Вселенной" и какой-то сборник рассказов в мягкой обложке. Но правда, в то время Хайнлайна в Союзе не печатали вовсе.
Знаний английского (чтобы читать в оригинале) у меня нет, поэтому отдельное спасибо за подсказку насчёт Щербакова - обидно бывает, когда талантливую вещь портят бездарным переводом, но ... TANSTAAFL, как было сказано выше.
...
Рейтинг: 0 / 0
Динамический массива
    #33471891
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Сыр..." учит нам тому, что если кто-то что-то нам бесплатно предлагает, то надо оглянуться вокруг в поисках большого капкана. А не быть лохом, и не получать граблями по лбу!

"ЛДНБ" учит нас тому что вообще ничего бесплатного не бывает. и за все приходится так или иначе платить.

Чуствуете разницу? ;-)

--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Динамический массива
    #33471913
suzum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackStar"ЛДНБ" учит нас тому что вообще ничего бесплатного не бывает. и за все приходится так или иначе платить.
Ну-у, этой-то истине меня не какая-то "ЛДНБ", а сама жизнь (во всём её многообразии) научила...
Маленький чат, пока модера нет ;)
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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