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

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

Войти
Регистрация
Восстановить пароль
 
Eugene THE BEST
9 / 9 / 0
Регистрация: 14.02.2010
Сообщений: 126
#1

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

27.02.2012, 22:17. Просмотров 946. Ответов 14
Метки нет (Все метки)

У меня есть двумерный булевый квадратный массив. После запуска программы, я получаю переменную 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++
an-1 an-2 ... a2

Динамическое выделение памяти - C++
Подскажите как выделить динамически память мод двумерный массив... Спасибо. ... int *mass = new int ; //int *mass = new int ; ) Не...

Динамическое выделение памяти - C++
Имеется: #define Index 1000 typedef int BaseType; typedef BaseType TMemList; typedef unsigned ptrel; typedef struct List...

Динамическое выделение памяти - C++
Здравствуйте, у меня вопросик такой: почему при "динамическом выделении памяти в строку" у меня вылетает программа!? а при обычном...

Динамическое выделение памяти - C++
Всем здрасти.Если выделять динамически память,например: char *p=new char; и при этом не перегружать оператор new.То верны ли следующие...

Динамическое выделение памяти - C++
Подскажите пожалуйста почему этот код работает: #include <iostream> using namespace std; int main() { int *x = new...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Luke
39 / 39 / 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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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
39 / 39 / 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
39 / 39 / 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
39 / 39 / 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
39 / 39 / 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
39 / 39 / 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, все циклы, функции работали.
А сейчас - надо то же самое сделать, но с динамическим массивом. Выделить память, заполнить, передать в функцию, и затем там использовать его как статический. И найти границу.
Код цикла в функции я кидал. Поглядите, пожалуйста, может получится..
Заранее, спасибо.
А сдвиги я гляну, чуть позже, спасибо.
Luke
39 / 39 / 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; //обязательно удаляем то что выделяли раньше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2012, 00:06
Привет! Вот еще темы с ответами:

Динамическое выделение памяти - C++
Первый раз столкнулся с такой задачей... Дали лабораторную работу: Разработать приложения, реализующее следующие функции: 1) Выделяет...

Динамическое выделение памяти - C++
Вот у меня есть 2 примера: char* str = &quot;Немыслимый текст&quot;; char* s = new char ; Тут указатель s будет указывать на блок в...

Динамическое выделение памяти - C++
Есть следующее объявление #include&lt;iostream&gt; #define MAX 1000 //======================= int arr; int arr2; int arr3; ...

Динамическое выделение памяти - C++
Всем привет. Научите, пожалуйста, правильно пользоваться динамическим выделением памяти. Допустим, у меня есть функция, где я пытался...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.02.2012, 00:06
Ответ Создать тему
Опции темы

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