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

Как освободить память в двумерном массиве в столбцах - C++

Восстановить пароль Регистрация
 
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.01.2014, 10:47     Как освободить память в двумерном массиве в столбцах #1
скажем так, чтобы освободить строку я пишу
C++
1
2
3
int **b; //
// инициализирю массив
delete [] b[3]; // удаляю указатель(массив) в 3 позиции
а как освободить память в вертикальных столбцах?
думал что можно так
C++
1
2
3
4
5
    for (int i=0;i<y;i++)
    {int &a=b[x][i];
    int *c=&a;
    delete c;
    }
но не прокатывает ... гуру С++подскажите как сделать это?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2014, 10:47     Как освободить память в двумерном массиве в столбцах
Посмотрите здесь:

как освободить память C++
C++ Как освободить память быстро?
C++ Как правильно освободить память
C++ как освободить память?
C++ Как правильно освободить память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.01.2014, 10:51     Как освободить память в двумерном массиве в столбцах #2
Тут же вроде отвечали на вопрос... очистка памяти
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.01.2014, 10:54  [ТС]     Как освободить память в двумерном массиве в столбцах #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Тут же вроде отвечали на вопрос... очистка памяти
да, но тогда я полностью очищал массив, сейчас я пытаюсь очистить определенные строки (delete [] b[1]) и определенные столбцы (delete ???)

Не по теме:

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

0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.01.2014, 10:57     Как освободить память в двумерном массиве в столбцах #4
Столбцы О_о
Нет, как память выделяли - так и освобождайте.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.01.2014, 11:00  [ТС]     Как освободить память в двумерном массиве в столбцах #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Столбцы О_о
Нет, как память выделяли - так и освобождайте.
т.е. отдельные элементы удалить никак ... жаль, ладно будем копировать и так удалять)
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
30.01.2014, 11:27     Как освободить память в двумерном массиве в столбцах #6
dzrkot, сам смысл массива в том, что его элементы располагаются последовательно в памяти. А вы собираетесь куски памяти в середине его удалять.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.01.2014, 11:34  [ТС]     Как освободить память в двумерном массиве в столбцах #7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
dzrkot, сам смысл массива в том, что его элементы располагаются последовательно в памяти. А вы собираетесь куски памяти в середине его удалять.
да...я такой)) ну задача так звучит :
Уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполненные ну*лями. Найти номер первой из строк, содержащих хотя бы один положительный
элемент.

вот как-то так...

мб я как-то её неправильно интерпретировал, но вроде очевидно, удалять - так удалять)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.01.2014, 11:42     Как освободить память в двумерном массиве в столбцах #8
Цитата Сообщение от dzrkot Посмотреть сообщение
мб я как-то её неправильно интерпретировал, но вроде очевидно, удалять - так удалять)
Не обязательно.
Если матрицу представить не в виде голого массива, а как структуру или класс, то можно хранить как размер выделенной памяти, так и фактически используемой. При "удалении" строк и столбцов фактически делать перемещение и соответственно уменьшать значение, соответствующее размерности. Перевыделение памяти можно сделать отдельной функцией, которую вызывать после всех преобразований.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.01.2014, 11:56  [ТС]     Как освободить память в двумерном массиве в столбцах #9
Цитата Сообщение от 0x10 Посмотреть сообщение
Не обязательно.
Если матрицу представить не в виде голого массива, а как структуру или класс, то можно хранить как размер выделенной памяти, так и фактически используемой. При "удалении" строк и столбцов фактически делать перемещение и соответственно уменьшать значение, соответствующее размерности. Перевыделение памяти можно сделать отдельной функцией, которую вызывать после всех преобразований.
да такое тоже можно сделать, но не хочу писать целый класс под это дело)
0x10
30.01.2014, 12:01
  #10

Не по теме:

Цитата Сообщение от dzrkot Посмотреть сообщение
не хочу писать целый класс под это дело)
Дело Ваше, конечно, в данном случае это оправдано. В противном случае придется везде в функции вместо одного объекта передавать три - массив и две размерности. Не говоря уже о том, что программа будет разделена на логические части.

dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.01.2014, 15:16  [ТС]     Как освободить память в двумерном массиве в столбцах #11

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
Дело Ваше, конечно, в данном случае это оправдано. В противном случае придется везде в функции вместо одного объекта передавать три - массив и две размерности. Не говоря уже о том, что программа будет разделена на логические части.
ну да, просто я тут 1 помогаю, и его преподаватель не поверит в объекты)



Добавлено через 14 минут
решил задачу банальным копированием

Добавлено через 2 часа 51 минуту
вообщем вотсама задача, и в ней у меня компилятор периодически ругается на delete в самом конце main - 118,119строки, если закомментировать то всё ок, почему - не понимаю, что не так? (вводитьбольше 8 т.е. 0строки и стобцы тупо организованы вручную и проиходит выход за массив в 58-67

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
void print(int** b, int x, int y);
 
bool findY(int** b,int x, int y)
{
int counter=0;
    for (int i=0;i<x;i++)
        {
        //cout<<setw(3)<<b[y][i];
        if (b[y][i]==0)
        counter++;
        }
if (counter==x)
    return true;
else
    return false;
}
 
bool findX(int** b,int x, int y)
{
int counter=0;
    for (int i=0;i<x;i++)
        {
        if (b[i][y]==0)
        counter++;
        }
if (counter==x)
    return true;
else
    return false;
}
 
int main()
{
    int x,y;
    srand(time(0));                // засеиваем rand()
    cout<<"enter array size x:";        // вводим размерность массива
    cin>>x;                             //
    cout<<"enter array size y:";        //
    cin>>y;                             //
 
int **b=new int*[x];        // выделяем память под массив указателей
 
for (int i=0;i<x;i++)       // в этом цикле мы заполняем массив b указателями на массивы а
{                           // , а массивы а мы постоянно соззаем и заполняем рандомом в цикле
int *a=new int[y];
    for (int j=0;j<y;j++)
    a[j]=rand()%20;
b[i]=a;         // сохраняем указатель на а в b
}
print(b,x,y);   // функция для вывода двумерного массива, она в конце проги
cout<<endl<<endl;
//////////////////////////////////////////////// здесь можно ввести 0 столбец или строку
for (int i=0;i<x;i++)
    b[i][4]=0;
 
for (int i=0;i<x;i++)
    b[2][i]=0;
 
for (int i=0;i<x;i++)
    b[6][i]=0;
////////////////////////////////////////////////
print(b,x,y);   // проверяем что у нас есть 0 столбцы и 0 строки
cout<<endl<<endl;
/*
далее я написал 2 функции, в которые мы передаем указатель на наш массив
b,длину строки(столбца) и номер столбца(строки) которую мы проверяем на 0
и ищем в нем 0 строки и 0 столбцы, если строка или столбце полностью состоят из 0,
то функции возвращают лог 1, если же нет - то лог 0
 findY(b,y,j) - строки!
 findX(b,x,j) - столбцы!
*/
int size_x=x,size_y=y;      // это переменные для подсчета кол-ва строк и столбцов в новом массиве
for (int j=0;j<x;j++)       // вызываем цикл с нашей функцией и считаем кол-во строк(столбцов)
    if (findY(b,y,j))       //
        size_x--;           //
for (int j=0;j<y;j++)       //
    if (findX(b,x,j))       //
        size_y--;           //
 
cout<<"size_x = "<<size_x<<endl;    // выводим размеры нов матрицы на экран (для првоерки)
cout<<"size_y = "<<size_y<<endl;    //
 
 
int **c=new int*[size_x];   // выделяем память под новую матрицу
for (int j=0;j<size_x;j++)
    //for (int i=0;i<size_y;i++)
    c[j]=new int[size_y];   // выделяем память под указатили в ячейках
 
for (int j=0,l=0;j<x;l++,j++)   // здесь мы уже начинаем саму запись в новый массив без 0 строк и столбцов
{
        if(findY(b,y,j))    // если лог 1, то итерируем строку l и пропускаем записьв из b в с
        {
        l--;
        continue;
        }
        else        //  если лог 0, то вызываем новый цикл, в котором повторяем тоже самое,но уже для столбцов
        {
            for (int i=0,k=0;k<size_y;i++,k++)
            {
                if (findX(b,x,i))
                {
                k--;
                continue;
                }
                else
                c[l][k]=b[j][i];    // здесь мы уже записываем в с из b ,точно зная что это не 0 строка и не 0 солбцец
            }
        }
}
print(c,size_x,size_y);     // выводим с чтобы убедиться что в с нету 90 строк и солбцов
 
for (int i=0;i<y;i++)       // полностью очищаем b т.к. он нам бльше не нужен
    delete [] b[i];         // при желании можно затем создать новый b , копировать туда с и удалить с
    delete [] b;            // но роли это осбо никакой не играет кроме названия указателей
 
    return 0;
}
 
void print(int** b, int x, int y)   // функция для вывода массива на экран - аргументы, указатель на 2ый массив и его размерность
{
int v;
bool flag=false;
    for (int i=0;i<x;i++)
    {
        for (int j=0;j<y;j++)
        {
        cout<<setw(3)<<b[i][j];
            if (b[i][j]>0&&!flag)
            {
            v=i+1;
            flag=true;
            }
        }
    cout<<endl;
    }
    if(flag)                // поиск положительного элемента в массиве
    cout<<"String number "<<v<<" have element thar >0"<<endl;
    else
    cout<<"Matrix hasen't elements >0"<<endl;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.01.2014, 15:23     Как освободить память в двумерном массиве в столбцах #12
Цитата Сообщение от dzrkot Посмотреть сообщение
не понимаю, что не так?
В 46 строке выделено Х элементов, а цикл в 117 идет до У.

Не по теме:

У самих от такого бардака в коде в глазах не рябит?
PS Вот чтобы не приходилось шариться по всему коду в поисках где какие размерности, я и предлагал завести под матрицу как минимум структуру, а все операции по выделению/освобождению памяти сделать отдельными функциями.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 15:37     Как освободить память в двумерном массиве в столбцах
Еще ссылки по теме:

Как правильно освободить память C++
C++ Как освободить память после удаления объекта из вектора
C++ Как правильно освободить память после работы с динамическим массивом

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

Или воспользуйтесь поиском по форуму:
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.01.2014, 15:37  [ТС]     Как освободить память в двумерном массиве в столбцах #13
Цитата Сообщение от 0x10 Посмотреть сообщение
В 46 строке выделено Х элементов, а цикл в 117 идет до У.
самое странное что я это тоже замтил и подставлял туда и х, ошибки были в обоих случаях, сейчас там остался у т.к. он в буфере скопирован был... сейчас работает нормально ....

Не по теме:

вы правы, но в данном случае мне были поставлены условия чтобы без этого всего, у меня класс под матрицы уже был написан недавно



Добавлено через 3 минуты
да и конечно же Спасибо вам)

Добавлено через 2 минуты
ещё нашёл в 62 , 64 - у вместо х )
Yandex
Объявления
30.01.2014, 15:37     Как освободить память в двумерном массиве в столбцах
Ответ Создать тему
Опции темы

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