Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 47

Удаление строки k в динамическом двумерном массиве

08.10.2018, 18:16. Показов 5265. Ответов 11

Студворк — интернет-сервис помощи студентам
Привет всем.
Столкнулся с неприятностью в выполнении лабораторной работы.
По заданию нужно удалить k строку в динамическом двумерном массиве.
Компилятор выдает ошибку "Недостаточно прав при доступе к чтению".
Помогите, плез.
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
#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;
 
int** create(int m, int n) {
    srand(time(0));
    int** a = new int*[m];
    for (int i = 0; i < m; i++) {
        a[i] = new int[n];
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            a[i][j] = rand() % 201 - 100;
        }
    }
    return a;
}
void print(int** a, int m, int n) {
 
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << a[i][j] << "\t";
        }
        cout << "\n";
    }
}
 
int** del(int** a, int m, int n, int k) {
        for(int i = k; i < m; i++)
        for(int j = 0; j < n; j++)
        a[i][j] = a[i+1][j];
    a = (int**)realloc(a, m * sizeof(int*));
    return b;
}
int main()
{
    int m, n;
    setlocale(0, "Rus");
    cout << "Для создания матрицы m x n введите m:\n";
    cin >> m;
    cout << "Введите n:\n";
    cin >> n;
    system("cls");
    int** a = new int*[m];
    for (int i = 0; i < m; i++)
        a[i] = new int[n];
    int k;
    while (1) {
        cout << "1.Создание матрицы\n2.Печать матрицы\n3.Удаление строки с номером K\n4.Удаление матрицы\n5.Выход\n";
        cin >> k;
        switch (k) {
        case 1:
            a = create(m, n);
            break;
        case 2:
            print(a, m, n);
            break;
        case 3:
            int k;
            cout << "Введите номер строки для удаления:" << endl;
            cin >> k;
            //m--;
            //print(a, m, n);
            a = del(a, m, n, k);
        case 5:
            return 0;
            break;
        default:
            break;
 
        }
    }
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.10.2018, 18:16
Ответы с готовыми решениями:

Удаление столбца в двумерном динамическом массиве
Необходимо удалить столбец, содержащий хотя бы один ноль, из двумерного динамического массива.(матрица) Кода нет, так как выходит ерунда.

Как переставить строки в динамическом двумерном массиве?
Нужно было написать программу, которая переставляет строки матрицы так, чтобы значения в столбце K шли в порядке убывания. и обязательно...

Поменять местами строки в двумерном динамическом массиве
В матрице нужно поменять строки местами (размер матрицы и элементы вводим)

11
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.10.2018, 18:42
Нельзя смешивать работу с памятью в C-стиле и C++-стиле. Если память выделили через new, то её можно только удалить через delete. realloc тут работать не будет.
0
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 47
08.10.2018, 18:43  [ТС]
valen10, realloc здесь не для удаления, а для пересоздания массива с новым размером.
Это как минимум работает хотя бы.
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.10.2018, 18:45
Цитата Сообщение от xi8 Посмотреть сообщение
C++
1
2
3
for(int i = k; i < m; i++) 
for(int j = 0; j < n; j++) 
a[i][j] = a[i+1][j];
Это лишнее. У вас многомерный массив представлен как массив указателей на одномерные массивы. Достаточно просто переписать указатели.

C++
1
2
for(int i = k; i < m; i++)
    a[i] = a[i+1];
0
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 47
08.10.2018, 18:51  [ТС]
valen10, ммм, спасибо за совет, но даже исправив это, программа не заработала
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.10.2018, 19:00
Лучший ответ Сообщение было отмечено xi8 как решение

Решение

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

Еще замечание: выделенную память нужно освобождать, иначе возникнут утечки. И смешивание new/delete вместе с malloc/realloc/free - это UB. Лучше написать свою функцию перераспределения памяти, в которой выполнится выделение новой памяти, копирование части из старой памяти и освобождение старой памяти.

C++
1
2
3
4
5
6
7
8
9
10
11
12
int** del(int** a, int m, int n, int k) {
    // Освобождение памяти!
    delete[] a[k];
    
    for(int i = k; i < m - 1; i++)
        a[i] = a[i+1];
 
 
    a = (int**)realloc(a, m * sizeof(int*)); // Это UB!!!
 
    return a;
}
1
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 47
08.10.2018, 19:05  [ТС]
valen10, дико извиняюсь, но вы проверяли работоспособность?
Просто изменив функцию на Ваш вариант, приложение завершилось(вылетело) с кодом ошибки 0x0.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
08.10.2018, 19:07
Цитата Сообщение от xi8 Посмотреть сообщение
приложение завершилось(вылетело) с кодом ошибки 0x0
xi8, а Вы в курсе, что этим кодом обозначается успешное завершение программы?
0
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 47
08.10.2018, 19:08  [ТС]
sourcerer, эм, у меня же из функции возврат идет в цикл, который завершится, когда пользователь нажмет 5.
А там сразу ЗАКРЫТИЕ.
Что не совсем успешное завершение моей лабораторной.
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.10.2018, 19:09
Цитата Сообщение от xi8 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
        case 3:
            int k;
            cout << "Введите номер строки для удаления:" << endl;
            cin >> k;
            //m--;
            //print(a, m, n);
            a = del(a, m, n, k);
        case 5:
            return 0;
            break;
А break кто ставить будет? А уменьшить m на 1 после удаления?
0
1 / 1 / 0
Регистрация: 08.10.2018
Сообщений: 47
08.10.2018, 19:12  [ТС]
valen10, а вот здесь моя вина.
Господи, сколько я уже раз решил эту задачу, а из-за break'а она не работала, лол.
Большое Вам спасибо, дай бог здоровья.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
08.10.2018, 19:53
xi8, почему Вы 2 раза объявляете матрицу ? Через switch - это по условию такое требование ?
напишите оригинал условия задачи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2018, 19:53
Помогаю со студенческими работами здесь

Удаление строки в двумерном массиве
Как удалить строку в двумерном массиве ?

Динамический массив в динамическом двумерном массиве
Как создать двумерный динамический массив, чтобы каждый массив в нем также был динамическим?

Работа со строками в двумерном динамическом массиве
Ребят, я окончательно запутался. Вот текст задания, которое мне нужно решить: Для двумерного динамического массива написать функцию,...

Циклический сдвиг в двумерном динамическом массиве
Вот такая программа, надо сделать циклический сдвиг в двумерном динамическом массиве по такой вот схеме (см. рис). да так, чтобы В...

В динамическом двумерном массиве заменить на 0 элементы с n-го по m-ный
Как можно в динамическом двумерном массиве заменить на 0 и вывести на экран элементы с n-го по m-ный,если учесть что n &lt; m ?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru