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

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

Восстановить пароль Регистрация
 
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
27.02.2012, 22:17     Динамическое выделение памяти #1
У меня есть двумерный булевый квадратный массив. После запуска программы, я получаю переменную size, это то, сколько элементов должно быть в массиве. Теперь мне необходимо выделить память под каждый элемент, динамически.
Я в этом знаю мало, попробовал сделать просто - не получилось, просит константу вместо шагом ранее полученного size
C++
1
bool **numbers=new bool [size][size];
Теперь есть мысль запустить два цикла и на каждой итерации выделять память под numbers[i][j]
Только вот я не уверен, что выйдет так, как надо.

Подскажите, как это правильно необходимо сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2012, 22:17     Динамическое выделение памяти
Посмотрите здесь:

C++ Динамическое выделение памяти
Динамическое выделение памяти C++
C++ динамическое выделение памяти
Динамическое выделение памяти C++
C++ Динамическое выделение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 22:21     Динамическое выделение памяти #2
Eugene THE BEST,

C++
1
bool* numbers = new bool [size1*size2];
В С++ даже двумерный массив представляет собой просто последовательность.
И если надо под него память. то просто перемножаешь размерности измерений, и будет тебе нужное число.

bool* numbers - будет указывать на numbers[0][0]
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
27.02.2012, 22:23     Динамическое выделение памяти #3
C++
1
2
3
    bool** numbers=new bool*[size];
    for(int i = 0; i < size; ++i)
        numbers[i] = new bool[size];
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
27.02.2012, 22:31  [ТС]     Динамическое выделение памяти #4
Спасибо Вам большое. Все работает.

Добавлено через 3 минуты
А, стоп, вопрос.
А как теперь объявлять этот массив в функции?
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 22:35     Динамическое выделение памяти #5
Eugene THE BEST, void test(int**mass) - примет указатель на2мерный массив.

вызов
C++
1
2
3
int mass [3][3] = {1,2,3,4,5,6,7,8,9};
 
test(&mass[0][0]);
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
27.02.2012, 22:38  [ТС]     Динамическое выделение памяти #6
Цитата Сообщение от Luke Посмотреть сообщение
&mass[0][0]
А какую роль здесь играют нули? Я бы хотел передать весь массив, а не только его первые элементы.
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 22:47     Динамическое выделение памяти #7
Eugene THE BEST, ты передаешь указатель на начало массива, нули это самое начало массива.внутри функции крутишь его как хочешь. это правильный подход.Или ты хочешь передать копию массива внутрь функции?
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
27.02.2012, 22:57  [ТС]     Динамическое выделение памяти #8
Luke, Спасибо, так понятнее.
Но до этого всегда я передавал полностью статический массив. И использовал его, вставлял в условия, проходил итерациями.
Поэтому я и сейчас изначально думал передать именно копию массива. Но раз это неправильно, то да, конечно же лучше передать указатель. но вот вопрос - потребуются ли дальше какие-нибудь присвоения в самой функции? Или с массивом можно будет работать так же, как и раньше было?

Добавлено через 6 минут
Так, ну вот и первая проблема здесь.
C++
1
int bottom(bool **numbers)
Так я объявляю двумерный массив в функции.
C++
1
bottomk = bottom(&numbers[0][0])
Так я посылаю в функцию указатель.

Cannot convert bool* to bool**
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 22:59     Динамическое выделение памяти #9
Цитата Сообщение от Luke Посмотреть сообщение
void test(int**mass)
только тут (int* mass).

Добавлено через 48 секунд
Цитата Сообщение от Eugene THE BEST Посмотреть сообщение
Cannot convert bool* to bool**
да убери одну звезду. лищняя.

к массиву обращайся от начала и используй смещения. например

C++
1
2
3
4
5
6
int* mass - начало  int mass[3][3] = {1,2,3,4,5,6,7,8,9};
 
двигаемся так  
mass ; - первая строка           1 2 3
mass + 1 +3  - вторая строка     4 5 6
mass +1 + 3+3;  -третья          7 8 9
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
27.02.2012, 22:59  [ТС]     Динамическое выделение памяти #10
Черт, теперь в самой функции ругается.
sum = numbers[l][m]+sum;

Invalid Indirection
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 23:11     Динамическое выделение памяти #11
Eugene THE BEST, скажи задание я накидаю функцию
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
27.02.2012, 23:20  [ТС]     Динамическое выделение памяти #12
Цитата Сообщение от Luke Посмотреть сообщение
используй смещения
Наверное, это и вызывает ошибку сейчас.
Вот цикл.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int l =checkx;l<=rightk;l++)
        {
                sum = 0;
                for (int m = topk;m<=bottomk;m++)
                {
 
                        sum = numbers[l][m]+sum;
                }
                if(sum >=1)
                {
                        return l;
 
                }
        }
Так, значит, при первом проходе все остается на месте, да?
При втором проходе шаг у l - единица, у m - 3. Так?
Должно быть что-то вроде m+=3;
А конечное значение m такое же остается?

Добавлено через 51 секунду
Цитата Сообщение от Eugene THE BEST Посмотреть сообщение
конечное значение m
bottomk в смысле

Добавлено через 3 минуты
Что-то я совсем запутался, да и в книге маловато об этом. Если несложно, помогите пожалуйста.
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 23:34     Динамическое выделение памяти #13
вот пример. посмотри его вывод. разбери его. он поможет разобраться. просто вставь его в мэйн и посмотри как работает смещение индекса. в этом примере p не меняется - это всегда начало. увеличивая цифры мы получаем некое нужное нам смещение


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int mass [3][3] = {1,2,3,4,5,6,7,8,9};
 
 
int* p = &mass[0][0];
 
 
 
for(int i=0;i<9;i+=3) //внешний цикл идет с шагом в длину строки 3, это размерность второго измерения
{
 
    for(int j =0;j<3; j++) //внутрений с шагом 1, для перебора каждого элемента строки
    {
        
 
        printf("%d",*(p+i+j));
        
    }
    printf("\n");
 
}
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
27.02.2012, 23:51  [ТС]     Динамическое выделение памяти #14
Как-то я сообщения некоторые пропускаю, извините..
Задание.
Взять булевый массив. Заполнить его единицами и нулями в зависимости от цвета (что неважно, я это уже сделал, не вдумывайтесь). Потом передать массив в функцию и найти границы единиц.
Вот у меня не получается сделать так, что бы массив был динамический. Для тестов использовал 200х200, все циклы, функции работали.
А сейчас - надо то же самое сделать, но с динамическим массивом. Выделить память, заполнить, передать в функцию, и затем там использовать его как статический. И найти границу.
Код цикла в функции я кидал. Поглядите, пожалуйста, может получится..
Заранее, спасибо.
А сдвиги я гляну, чуть позже, спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2012, 00:06     Динамическое выделение памяти
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
28.02.2012, 00:06     Динамическое выделение памяти #15
вот полный пример. создание динамического массива
наполнение 0 и 1 вывод и удаление из памяти.
специально не точно по заданию. Важно самому понять как все работает.
уж для булевых думаю сам подставишь. важно понять принцип

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
int* p = new int [6*7];//вот динамический, размер можно гибко задавать
//в этом примере это int [6][7]
 
 
for(int i=0;i<42;i+=7) //заполняем массив
{
 
    for(int j =0;j<7; j++)
    {
        if(j%2) // это просто условие если j делится на 2 то ставим 1
        *(p+i+j) = 1;
        else // иначе 0
        *(p+i+j) = 0;
        
    }
 
}
for(int i=0;i<42;i+=7) //печатаем массив. шаг 7
{
 
    for(int j =0;j<7; j++)//шаг 1 в строке
    {
      
        printf("%d",*(p+i+j));
        
    }
    printf("\n");
 
}
    
delete [] p; //обязательно удаляем то что выделяли раньше
Yandex
Объявления
28.02.2012, 00:06     Динамическое выделение памяти
Ответ Создать тему
Опции темы

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