Форум программистов, компьютерный форум 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. Просмотров 1783. Ответов 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++
Пробовал вот таким вот образом в заголовочном файле const int big_numbers = { 1000, 2000, 3000 }; error C2059: syntax error : '{'...

Ошибка на стадии выполнения ptr = ptr; - C++
class CObject { friend Parser; // много полей методов, все должны заполняться в парсере } class Parser { CObject * object_...

Как изменить многомерный массив? - 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])?
Еще ссылки по теме:

Как представить многомерный массив в одномерный? - C++
Задана матрица размерностью h*w. Как представить многомерный массив в одномерный? Напишите пожалуйста программу для visual studio

Как конвертировать массив int в int? - C++
Есть массив целых чисел, как из всех этих чисел получить одно единственное? int myints = {7, 4, 5, 3, 0}; int a; //Хочу чтобы a =...

Как можно записать многомерный массив в векторе? - C++
Всем привет) Есть проблема: не могу понять как можно записать многомерный массив в векторе. т.е. я сначала должен ввести с клавиатуры какой...

Как перевести массив строк в массив int - C++
for (int i=0; i&lt;str.size(); i++) { str=static_cast&lt;int&gt;(str); } есть vector &lt;string&gt; str; Оно не...


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

Или воспользуйтесь поиском по форуму:
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])?
Ответ Создать тему
Опции темы

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