Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Как обьявить указатель на двумерный массив? - 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_...

Как заполнить один int пустой массив другим int массивом ? - C++
Можно пример кода :)

Как изменить многомерный массив? - C++
Обесните плз - я объявляю многомерный массив и заполняю. Когда в программе я пытаюсь его изменить происходит ошибка. С одномерными все...

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

Читайте Страуструпа, блин!!!
Archie
28.02.2008, 19:31 #9
2VVP
Лучше бы посоветовали что-нибуть мной еще непрочитанное.
А по поводу стандарта С++ скажу следующее: компилятор VС++ (а также другие) на сегодняшний день не отражает даже стандарт августа 1998 года (начиная с import-директивы и заканчивая спецификацией на описание функций, генерирующих исключения). А вы не задумывались никогда почему мало-мальски большой проект с активным использованием шаблонов компилируется невыносимо долго ? Подумайте на досуге. И собственно не факт что программа, скомпилированная на VC++ выделит память так как вам понравится (с тем фактом что в вашем коде память выделится целым куском я не в коем случае не спорю, потому как именно так оно и будет). Из выше сказанного следует что тыкать книжкой Страустропа это конечно круто.
VVP
28.02.2008, 19:41 #10
Ну так перечитайте, потому как NetMinion задал вопрос и сам на него криво попытался ответить, ему простительно. А вы написали действительно тоже самое, а теперь чего-то говорите про компилер, про невыносимо догую компиляцию. Вы на вопрос не смогли ответить.
NetMinon
0 / 0 / 0
Регистрация: 16.12.2006
Сообщений: 88
28.02.2008, 23:15  [ТС] #11
Большое спасибо за замечания и дополнения...
Согласен, что в моем примере, не хватает цикла и операторов удаления масива (универсальности) , я просто постарался упростить пример до максимума, чтобы более наглядно продемонстрировать сам процесс...
Пример, с одним new очень интересный, обязательно им воспользуюсь...
NetMinion
0
Snork
29.02.2008, 14:26 #12
Читайте Джефа Элджера. Официальное название книги не помню, неофициальное - 'C++: Путь гуру.' Там про многие интересные вещи написано, в т.ч. и про работу с многомерными массивами.
alex_lv
0 / 0 / 0
Регистрация: 26.02.2008
Сообщений: 8
01.03.2008, 19:06 #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
}
0
VVP
02.03.2008, 13:09 #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  [ТС] #15
м да, а вот это уже помоему высший пилотаж....
чето я както не особо разобрался в этом... скиньте пожалуйста ссылку на статью или еще что-то в этом роде...
а то трудновато для понимания...
Заранее благодарен NetMinion
0
02.03.2008, 15:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2008, 15:08
Привет! Вот еще темы с ответами:

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

как можно ипользовать многомерный массив? - C++
Изучил массивы и стало интересно,как можно использовать многомерные массивы, в книги не написано про их использование а только упомянуто их...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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