Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
NetMinon
0 / 0 / 0
Регистрация: 16.12.2006
Сообщений: 88
#1

Как динамически обьявить многомерный массив (ptr = new int[5][5])? - C++

23.02.2008, 23:31. Просмотров 1778. Ответов 18
Метки нет (Все метки)

как обявить вот такую вот штуку:
int * ptr = new int[5][5];
заранее благодарен Роман.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2008, 23:31     Как динамически обьявить многомерный массив (ptr = new int[5][5])?
Посмотрите здесь:

как можно ипользовать многомерный массив? C++
C++ Как вернуть динамически растущий массив из функции?
Как обьявить указатель на двумерный массив? C++
C++ Как изменить многомерный массив?
C++ Как задать динамически массив?
C++ Как обьявить и инициализировать массив константных значений?
C++ Как обьявить глобальную переменную
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NetMinon
0 / 0 / 0
Регистрация: 16.12.2006
Сообщений: 88
24.02.2008, 00:58  [ТС]     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #2
у меня пока только так получилось, но я не думаю что это самый правильный вариат...
C++
1
2
3
4
5
6
7
8
9
10
11
    // 3х3 //
int **t;
t = new int*[3];
t[0] = new int[3];
t[1] = new int[3];
t[2] = new int[3];
 
t[0][1] = 1;
t[0][2] = 2;
t[0][3] = 3;
t[1][1] = 1;
если есть замечания - пишите...
Archie
Сообщений: n/a
28.02.2008, 14:57     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #3
Я правильно понял что проблема лишь в выделении памяти ??? Если так, то нет ничего проще.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef int SOME_TYPE;
 
const long g_M = 5;
const long g_N = 5;
 
int main(int argc, char* argv[])
{
  SOME_TYPE **ppArr;
  long i;
 
  ppArr = new SOME_TYPE* [g_M];
  for( i = 0; i < g_M; i++ )
    ppArr[i] = new SOME_TYPE [g_N];
 
  //...
 
  for( i = 0; i < g_M; i++ )
    delete [] ppArr[i];
  delete [] ppArr;
 
  return 0;
}
NetMinon
0 / 0 / 0
Регистрация: 16.12.2006
Сообщений: 88
28.02.2008, 16:42  [ТС]     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #4
м да...
ты написал тоже самое что и я но намного длинее
Archie
Сообщений: n/a
28.02.2008, 18:18     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #5
ты хотел сказать универсальнее
VVP
Сообщений: n/a
28.02.2008, 18:55     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #6
Можно обойтись одним new, взяв столько памяти, сколько нужно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  int max_x=5, max_y=5, cx, cy;
  int **p_arr=NULL;
 
  (*p_arr)=new int[max_x*max_y];
 
  // здесь трактуешь p_arr как двумерный массив
  for( cx=0; cx<max_x; cx++ )
    for( cy=0; cy<max_y; cy++ )
      p_arr[cx][cy]=cx*cy;
 
  delete (*p_arr);
}
Может есть какие нечеткости в доступе к элементу массива, но решаются сменой положения индекса.
Archie
Сообщений: n/a
28.02.2008, 19:01     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #7
Понятно, что написать функцию доступа к элементу одномерного массива и по трем индексам несложно для эмуляции 3-мерного массива, только зачем ?
VVP
Сообщений: n/a
28.02.2008, 19:13     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #8
Вы сами поняли, чего сказали-то? Где вы видите 'функцию доступа к элементу'? В примере идет работа с ДВУМЕРНЫМ МАССИВОМ. И если вы правильно выделили память, то кому какое дело как вы объявили переменную? Между прочим, int ptr[a][b] эквивалентен int **ptr, за одним маленьким исключением: в первом объявлении в стеке или статически память выделяется компилятором, в моем примере память выделил я. Кстати по стандарту память в куче выделятся единым куском.

Читайте Страуструпа, блин!!!
Archie
Сообщений: n/a
28.02.2008, 19:31     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #9
2VVP
Лучше бы посоветовали что-нибуть мной еще непрочитанное.
А по поводу стандарта С++ скажу следующее: компилятор VС++ (а также другие) на сегодняшний день не отражает даже стандарт августа 1998 года (начиная с import-директивы и заканчивая спецификацией на описание функций, генерирующих исключения). А вы не задумывались никогда почему мало-мальски большой проект с активным использованием шаблонов компилируется невыносимо долго ? Подумайте на досуге. И собственно не факт что программа, скомпилированная на VC++ выделит память так как вам понравится (с тем фактом что в вашем коде память выделится целым куском я не в коем случае не спорю, потому как именно так оно и будет). Из выше сказанного следует что тыкать книжкой Страустропа это конечно круто.
VVP
Сообщений: n/a
28.02.2008, 19:41     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #10
Ну так перечитайте, потому как NetMinion задал вопрос и сам на него криво попытался ответить, ему простительно. А вы написали действительно тоже самое, а теперь чего-то говорите про компилер, про невыносимо догую компиляцию. Вы на вопрос не смогли ответить.
NetMinon
0 / 0 / 0
Регистрация: 16.12.2006
Сообщений: 88
28.02.2008, 23:15  [ТС]     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #11
Большое спасибо за замечания и дополнения...
Согласен, что в моем примере, не хватает цикла и операторов удаления масива (универсальности) , я просто постарался упростить пример до максимума, чтобы более наглядно продемонстрировать сам процесс...
Пример, с одним new очень интересный, обязательно им воспользуюсь...
NetMinion
Snork
Сообщений: n/a
29.02.2008, 14:26     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #12
Читайте Джефа Элджера. Официальное название книги не помню, неофициальное - 'C++: Путь гуру.' Там про многие интересные вещи написано, в т.ч. и про работу с многомерными массивами.
alex_lv
0 / 0 / 0
Регистрация: 26.02.2008
Сообщений: 8
01.03.2008, 19:06     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #13
А я делал так:

C++
1
2
3
4
5
6
7
8
9
int **A;
int Am;    // К-во строк.
int An;    // К-во столбцов.
 
A = new int*[Am];           // STEP 1: SET UP THE ROWS.
for (j = 0; j < Am; j++)
{
   A[j] = new int[An];      // STEP 2: SET UP THE COLUMNS
}
VVP
Сообщений: n/a
02.03.2008, 13:09     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #14
Господа, написавшие объявления массива через несколько циклов, на кой ляд вы это делаете? Да вы получите доступ к элементу через A[x][y]. Но во первых вы берете памяти на sizeof(int**)*Am байт больше чем нужно, под размещение массива указателей (A=new int*[Am]). Во вторых, специально для Archie, статья из MSDN, описывающая размещение памяти и индексацию многомерных массивов, кстати полностью соответствующая стандарту. В третьих, если уж вы настаиваете на раздельном размещении памяти, то присоветуйте человеку использовать vector и ВСЕ!!!

Итак, обещанная статья:
Код
Interpretation of Subscript Operator
Like other operators, the subscript operator ([ ]) can be redefined by the user. The default behavior of the subscript operator, if not overloaded, is to combine the array name and the subscript using the following method:

*((array-name) + (subscript))

As in all addition that involves pointer types, scaling is performed automatically to adjust for the size of the type. Therefore, the resultant value is not subscript bytes from the origin of array-name; rather, it is the subscriptth element of the array. (For more information about this conversion, see Additive Operators in Chapter 4.)

Similarly, for multidimensional arrays, the address is derived using the following method:

 *((array-name) + (subscript1* max2 * max3...maxn)
              + subscript2 * max3...maxn)
                   . . . + subscriptn))
NetMinon
0 / 0 / 0
Регистрация: 16.12.2006
Сообщений: 88
02.03.2008, 15:08  [ТС]     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #15
м да, а вот это уже помоему высший пилотаж....
чето я както не особо разобрался в этом... скиньте пожалуйста ссылку на статью или еще что-то в этом роде...
а то трудновато для понимания...
Заранее благодарен NetMinion
Snork
Сообщений: n/a
02.03.2008, 18:30     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #16
Ссылок тут в избытке. Рекомендую свою. Дам наводку помимо ссылки - операторы перегружаются так же, как и любые функции. В данном случае перегружается оператор []. Для смартеров нужно перегружать оператор ->. В этом нет ничего 'высшего'. А вот продуманная схема применения таких фич - это да, заслуживает уважения. Например, хорошо продуманная схема смартеров. Потому, как такой код обычно тщательно проектируется.
VVP
Сообщений: n/a
02.03.2008, 18:58     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #17
Что такое 'смартеры'
Snork
Сообщений: n/a
02.03.2008, 19:37     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #18
Smart-pointers.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2008, 17:35     Как динамически обьявить многомерный массив (ptr = new int[5][5])?
Еще ссылки по теме:

Ошибка на стадии выполнения ptr = ptr; C++
C++ Как обьявить массив неизвестного размера?
Как можно записать многомерный массив в векторе? C++
C++ Как представить многомерный массив в одномерный?
C++ Как конвертировать массив int в int?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Archie
Сообщений: n/a
03.03.2008, 17:35     Как динамически обьявить многомерный массив (ptr = new int[5][5])? #19
2VVP
за статью спасибо, так я это и имел ввиду когда говорил про функцию доступа к элементам такого массива, всегда приятно когда кто-то разбирается в вопросе детально
Yandex
Объявления
03.03.2008, 17:35     Как динамически обьявить многомерный массив (ptr = new int[5][5])?
Ответ Создать тему
Опции темы

Текущее время: 16:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru