Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/41: Рейтинг темы: голосов - 41, средняя оценка - 4.90
vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
#1

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

24.03.2012, 23:07. Просмотров 7385. Ответов 13
Метки нет (Все метки)

Здравствуйте.
Как мне правильно и грамотно (!) выделять память под двумерные массивы?

Откуда возникла необходимость — хотел сделать такое вот:
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
Что делать? Что правильно делать?
Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2012, 23:07
Ответы с готовыми решениями:

Динамическое выделение памяти под двумерный массив
Нужно написать программу, динамически выделяем память под двумерный массив,...

Динамическое выделение памяти под двумерный массив
1) Ввести построчно элементы двумерного массива чисел. Количество столбцов...

Двумерный Массив,динамическое выделение памяти-ошибка
Здравствуйте! Не могу найти ошибку в программе, некорректно работает именно с...

Создать двумерный массив, использовав динамическое выделение памяти
int n=4; double **a = new double* ; for (int i = 0; i < n+1; i++) { a=new...

Динамическое выделение памяти под массив
Доброго времени суток. Как реализовать динамическое выделение памяти под...

13
Nekto
342 / 287 / 37
Регистрация: 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];
1
vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
24.03.2012, 23:17  [ТС] #3
Nekto, во второй строке new bool , наверное, да?

После всех махинаций с ним можно работать как с обычным массивом, да?
И еще: как его правильно удалять?
0
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
24.03.2012, 23:17 #4
delete
0
vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
24.03.2012, 23:19  [ТС] #5
valeriikozlov, понятное дело.
C++
1
delete [][] booleanArray;
так?
0
Nekto
342 / 287 / 37
Регистрация: 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 ;
1
vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
24.03.2012, 23:22  [ТС] #7
Всем спасибо.
Вопрос решен.
0
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
24.03.2012, 23:34 #8
я написал сообщение об ошибке:
Цитата Сообщение от vortexx1 Посмотреть сообщение
во второй строке new bool
когда увидел что ошибка уже найдена, то таким образом:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
delete
удалил свое сообщение.
то что delete имеет отношение к удалению динамических массивов просто совпадение )
1
vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.03.2012, 14:30  [ТС] #9
О, еще вопрос есть: а как мне создать этот массив функцией?
Допустим, в main объявить указатель, а остальной свистопляс вынести отдельно.

Покажите, пожалуйста, а то я тут попробовал и утонул в этих всех указателях
0
Nekto
342 / 287 / 37
Регистрация: 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 только не уверен, мб как-то по-другому надо.
3
vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.03.2012, 17:22  [ТС] #11
Nekto, ми-ми-ми прям. Спасибо огромное, добра тебе
0
Jaxmackey
3 / 3 / 2
Регистрация: 04.10.2013
Сообщений: 142
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);
1
SmittWesson
211 / 184 / 21
Регистрация: 04.06.2014
Сообщений: 1,306
17.08.2016, 10:01 #13
Вот ЗДЕСЬ Вы найдёте некоторые полезные функции.
0
Jaxmackey
3 / 3 / 2
Регистрация: 04.10.2013
Сообщений: 142
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;
}
1
17.08.2016, 10:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2016, 10:12

Динамическое выделение памяти под массив
Я хочу функцию использовать пару раз, количество команд будет уменьшаться, и...

Динамическое выделение памяти под массив int
плиз хелп Написать функцию getPrimes, которая принимает массив типа int и его...

Динамическое выделение памяти под массив структур (new/delete)
Люди добрые, подскажите пожалуйста, где в моем коде закралась ошибка? Интернет...


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

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

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