Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 16.12.2006
Сообщений: 88

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

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

Студворк — интернет-сервис помощи студентам
как обявить вот такую вот штуку:
int * ptr = new int[5][5];
заранее благодарен Роман.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2008, 23:31
Ответы с готовыми решениями:

Как создавать многомерный массив динамически из БД?
Есть таблица, в которой указано родительские и дочерние элементы. Как построить из них многомерный массив? Должно...

Как обьявить массив в PROGMEM?
Есть такой вот код примерно #define symb_0 seg_a_MASK | seg_b_MASK | seg_c_MASK | seg_d_MASK | seg_e_MASK | seg_f_MASK #define...

Как обьявить массив неизвестного размера?
Помогите разобраться, есть класс, в котором обьявлен двумерный массив структур. Размер массива неизвестен, но должен быть определен во...

18
0 / 0 / 1
Регистрация: 16.12.2006
Сообщений: 88
24.02.2008, 00:58  [ТС]
у меня пока только так получилось, но я не думаю что это самый правильный вариат...
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;
если есть замечания - пишите...
0
Archie
28.02.2008, 14:57
Я правильно понял что проблема лишь в выделении памяти ??? Если так, то нет ничего проще.

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;
}
0 / 0 / 1
Регистрация: 16.12.2006
Сообщений: 88
28.02.2008, 16:42  [ТС]
м да...
ты написал тоже самое что и я но намного длинее
0
Archie
28.02.2008, 18:18
ты хотел сказать универсальнее
VVP
28.02.2008, 18:55
Можно обойтись одним 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
28.02.2008, 19:01
Понятно, что написать функцию доступа к элементу одномерного массива и по трем индексам несложно для эмуляции 3-мерного массива, только зачем ?
VVP
28.02.2008, 19:13
Вы сами поняли, чего сказали-то? Где вы видите 'функцию доступа к элементу'? В примере идет работа с ДВУМЕРНЫМ МАССИВОМ. И если вы правильно выделили память, то кому какое дело как вы объявили переменную? Между прочим, int ptr[a][b] эквивалентен int **ptr, за одним маленьким исключением: в первом объявлении в стеке или статически память выделяется компилятором, в моем примере память выделил я. Кстати по стандарту память в куче выделятся единым куском.

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

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
}
0
VVP
02.03.2008, 13:09
Господа, написавшие объявления массива через несколько циклов, на кой ляд вы это делаете? Да вы получите доступ к элементу через A[x][y]. Но во первых вы берете памяти на sizeof(int**)*Am байт больше чем нужно, под размещение массива указателей (A=new int*[Am]). Во вторых, специально для Archie, статья из MSDN, описывающая размещение памяти и индексацию многомерных массивов, кстати полностью соответствующая стандарту. В третьих, если уж вы настаиваете на раздельном размещении памяти, то присоветуйте человеку использовать vector и ВСЕ!!!

Итак, обещанная статья:
Code
1
2
3
4
5
6
7
8
9
10
11
12
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))
0 / 0 / 1
Регистрация: 16.12.2006
Сообщений: 88
02.03.2008, 15:08  [ТС]
м да, а вот это уже помоему высший пилотаж....
чето я както не особо разобрался в этом... скиньте пожалуйста ссылку на статью или еще что-то в этом роде...
а то трудновато для понимания...
Заранее благодарен NetMinion
0
Snork
02.03.2008, 18:30
Ссылок тут в избытке. Рекомендую свою. Дам наводку помимо ссылки - операторы перегружаются так же, как и любые функции. В данном случае перегружается оператор []. Для смартеров нужно перегружать оператор ->. В этом нет ничего 'высшего'. А вот продуманная схема применения таких фич - это да, заслуживает уважения. Например, хорошо продуманная схема смартеров. Потому, как такой код обычно тщательно проектируется.
VVP
02.03.2008, 18:58
Что такое 'смартеры'
Snork
02.03.2008, 19:37
Smart-pointers.
Archie
03.03.2008, 17:35
2VVP
за статью спасибо, так я это и имел ввиду когда говорил про функцию доступа к элементам такого массива, всегда приятно когда кто-то разбирается в вопросе детально
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2008, 17:35
Помогаю со студенческими работами здесь

Как правильно обьявить массив обьектов?
Есть класс CDate; как правильно обьявить массив обьектов данного класса?

Как обьявить указатель на двумерный массив?
обьясните на примере как обьявить указатель на двумерный массив и потом обращаться к элементам через указатель

Добавление массива в многомерный массив (не элемента в многомерный массив)
Доброго времени суток уважаемые форумчане! Столкнулся с такой проблемой: требуется в многомерный массив добавить другой ассоц. массив...

Как обьявить и инициализировать массив константных значений?
Пробовал вот таким вот образом в заголовочном файле const int big_numbers = { 1000, 2000, 3000 }; error C2059: syntax error : '{'...

как обьявить массив указaтелей на обьекты класа
как обьявит массив указтелей на обьекты класа объявление T *obiecti=new T*; почему-то не вызывает конструктор объясните пожалуйста


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru