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

Динамическое выделение памяти под двумерный массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.72
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
24.03.2012, 23:07     Динамическое выделение памяти под двумерный массив #1
Здравствуйте.
Как мне правильно и грамотно (!) выделять память под двумерные массивы?

Откуда возникла необходимость — хотел сделать такое вот:
C++
1
2
3
4
5
int height, width;
inputSize( &height, &width );
 
bool booleanArray[ height + 2 ][ width + 2 ];
short numArray[ height + 2 ][ width + 2 ];
но мой Dev-C++ сказал:
variable-sized object "booleanArray" may not be initialized
variable-sized object "numArray" may not be initialized
Что делать? Что правильно делать?
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 23:14     Динамическое выделение памяти под двумерный массив #2
C++
1
2
bool **booleanArray = new bool*[height+2];
for (int i = 0; i < height+2; i++) booleanArray[i] = new bool[width+2];
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
24.03.2012, 23:17  [ТС]     Динамическое выделение памяти под двумерный массив #3
Nekto, во второй строке new bool , наверное, да?

После всех махинаций с ним можно работать как с обычным массивом, да?
И еще: как его правильно удалять?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.03.2012, 23:17     Динамическое выделение памяти под двумерный массив #4
delete
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
24.03.2012, 23:19  [ТС]     Динамическое выделение памяти под двумерный массив #5
valeriikozlov, понятное дело.
C++
1
delete [][] booleanArray;
так?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 23:20     Динамическое выделение памяти под двумерный массив #6
Цитата Сообщение от vortexx1 Посмотреть сообщение
Nekto, во второй строке new bool , наверное, да?
да, опечатка

Добавлено через 1 минуту
Цитата Сообщение от vortexx1 Посмотреть сообщение
valeriikozlov, понятное дело.
C++
1
delete booleanArray[][];
?
C++
1
2
for (int i = 0; i < height+2; i++) delete[]booleanArray[i];
delete[]booleanArray ;
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
24.03.2012, 23:22  [ТС]     Динамическое выделение памяти под двумерный массив #7
Всем спасибо.
Вопрос решен.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.03.2012, 23:34     Динамическое выделение памяти под двумерный массив #8
я написал сообщение об ошибке:
Цитата Сообщение от vortexx1 Посмотреть сообщение
во второй строке new bool
когда увидел что ошибка уже найдена, то таким образом:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
delete
удалил свое сообщение.
то что delete имеет отношение к удалению динамических массивов просто совпадение )
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.03.2012, 14:30  [ТС]     Динамическое выделение памяти под двумерный массив #9
О, еще вопрос есть: а как мне создать этот массив функцией?
Допустим, в main объявить указатель, а остальной свистопляс вынести отдельно.

Покажите, пожалуйста, а то я тут попробовал и утонул в этих всех указателях
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.03.2012, 15:28     Динамическое выделение памяти под двумерный массив #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
int** create_array(int rows, int cols)
{
 int** array=new int*[rows];
 for (int i=0;i<rows;i++)
     array[i]=new int[cols]; 
 return array;    
}
 
void input_array(int ** array,int rows, int cols)
{
 srand(time(NULL));
 for (int i=0;i<rows;i++)
     for (int j=0;j<cols;j++)
         array[i][j]=rand() % 100;
}
void print_array(int ** array, int rows, int cols)
{
 for (int i=0;i<rows;i++)
     {
      for (int j=0;j<cols;j++)
         printf("%d ", array[i][j]);
      printf("\n");
     }
}
 
void delete_array(int **array,int rows)
{
 for (int i=0;i<rows;i++) delete [] array[i];
 delete [] array;       
}
int main()
{
    int n=5; int m=6;
    int ** global_array;
    global_array=create_array(n,m);    
    input_array(global_array,n,m);
    print_array(global_array,n,m);
    delete_array(global_array,n);
    getch();
    return 0;
}
Добавлено через 1 минуту
с delete только не уверен, мб как-то по-другому надо.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.03.2012, 17:22  [ТС]     Динамическое выделение памяти под двумерный массив #11
Nekto, ми-ми-ми прям. Спасибо огромное, добра тебе
Jaxmackey
 Аватар для Jaxmackey
3 / 3 / 1
Регистрация: 04.10.2013
Сообщений: 99
17.08.2016, 09:54     Динамическое выделение памяти под двумерный массив #12
Рассмотрен массив с квадратной матрицей

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
 
char* Rus(const char*);
void main(void);
 
char bufRus[256];
 
void main(void)
{
    int **parray;
    int size;
    printf(Rus("введите размерность матрицы: "));
    scanf_s("%d", &size);
    parray = (int**)calloc(size, sizeof(int));
    for (int x = 0; x < size; x++)
    {
        parray[x] = (int*)calloc(size, sizeof(int)); 
    }
    int i = 0;
    int j = 0;
    for (i = 0; i < size; i++)
    {
        for (j = 0; j < size; j++)
        {
            printf("array[%d] [%d] = ", i, j);
            scanf_s("%d", &parray[i][j]);
        }
    }
    for (int q = 0; q < size; q++)
    {
        for (int z = 0; z < size; z++)
        {
            printf("%8d", parray[q][z]);
            if ((z + 1) % size == 0)
                printf("\n");
 
        }
    }
    int t = 1;
    int sum = 0;
    for (int w = 0; w < size; w++)
    {
        for (int e = t; e < size; e++)
        {
            if (parray[w][e]>0)
            {
                sum += parray[w][e];
            }
        }
        t++;
    }
    printf(Rus("Сумма не отрицательных элементов выще главной диагонали равна %d\n"), sum);
 
}
 
char* Rus(const char* text)
{
    CharToOemA(text, bufRus);
    return bufRus;
}

Либо так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
 
char* Rus(const char*);
void main(void);
 
char bufRus[256];
 
void main(void)
{
    int *parray;
    int size;
    printf(Rus("введите размерность матрицы: "));
    scanf_s("%d", &size);
    parray = (int*)calloc(size, sizeof(int));
    int sum = 0;
    parray = (int*)realloc(parray, size*size*sizeof(int));
    for (int i = 0; i < size; i++)
    {
        for (int s = 0; s < size; s++)
        {
            printf("[%d] [%d] = ", i, s);
            scanf("%d", parray + i + s);
        }
    }
    for (int i = 0; i < size; i++)
    {
        for (int s = 0; s < size; s++)
        {
            printf("%8d", *(parray + i + s));
            if ((s + 1) % size == 0)
                printf("\n");
        }
    }
    int t = 1;
    for (int i = 0; i < size; i++)
    {
        for (int s = t; s < size; s++)
        {
            if (*(parray + i + s) > 0)
            {
                sum += *(parray + i + s);
SmittWesson
 Аватар для SmittWesson
120 / 169 / 17
Регистрация: 04.06.2014
Сообщений: 1,273
17.08.2016, 10:01     Динамическое выделение памяти под двумерный массив #13
Вот ЗДЕСЬ Вы найдёте некоторые полезные функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2016, 10:12     Динамическое выделение памяти под двумерный массив
Еще ссылки по теме:

Динамическое выделение памяти под структуру C++
Динамическое выделение памяти под массив C++
Динамическое выделение памяти под двумерный массив C++

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

Или воспользуйтесь поиском по форуму:
Jaxmackey
 Аватар для Jaxmackey
3 / 3 / 1
Регистрация: 04.10.2013
Сообщений: 99
17.08.2016, 10:12     Динамическое выделение памяти под двумерный массив #14
А вот с нью и делете.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
 
char* Rus(const char*);
void main(void);
 
char bufRus[256];
 
void main(void)
{
    int *parray;
    int size;
    printf(Rus("введите размерность матрицы: "));
    scanf_s("%d", &size);
    int sum = 0;
    parray = new int[size*size*sizeof(int)]; //выделяем память под массив с квадратной матрицей поэтому size(количество строк) * size(количество столбцов) * sizeof(int)(размер создаваемого элемента) 
    for (int i = 0; i < size; i++)
    {
        for (int s = 0; s < size; s++)
        {
            printf("[%d] [%d] = ", i, s);
            scanf("%d", parray + i + s);
        }
    }
    for (int i = 0; i < size; i++)
    {
        for (int s = 0; s < size; s++)
        {
            printf("%8d", *(parray + i + s));
            if ((s + 1) % size == 0)
                printf("\n");
        }
    }
    int t = 1;
    for (int i = 0; i < size; i++)
    {
        for (int s = t; s < size; s++)
        {
            if (*(parray + i + s) > 0)
            {
                sum += *(parray + i + s);
 
            }
        }
        t++;
    }
    printf(Rus("Сумма не отрицательных элементов выще главной диагонали равна %d\n"), sum);
    delete[]parray;
}
 
char* Rus(const char* text)
{
    CharToOemA(text, bufRus);
    return bufRus;
}
Yandex
Объявления
17.08.2016, 10:12     Динамическое выделение памяти под двумерный массив
Ответ Создать тему
Опции темы

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