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

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

Войти
Регистрация
Восстановить пароль
 
Infinitesimal
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 2
#1

Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы - C++

29.04.2016, 12:37. Просмотров 348. Ответов 5

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

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

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
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <clocale>
#include <time.h>
 
int ** createMas(int h, int w); // Функция выделения памяти под массив с заданными размерами
void setMasManually(int** M, int h, int w); // Функция заполнения массива вручную
void setMasRandom(int** M, int h, int w); // Функция заполнения массива случайными числами
void printMas(int** M, int h, int w); // Функция вывода массива на экран
void deleteMas(int** M, int h); // Функция освобождения памяти из-под массива
 
int main()
{
    setlocale(LC_ALL, "Russian");
    setlocale(LC_ALL, "rus");
 
    int w = 0, h = 0; // Ширина и высота массива
 
    int ** mas = NULL;
 
    int menu = 0;
 
    do
    {
        printf("Меню программы \n");
        printf("1. Задать размеры массива \n");
        printf("2. Заполнить массив вручную \n");
        printf("3. Заполнить массив случайными числами \n");
        printf("4. Вывести массив на экран \n");
        printf("---------------------------------------------------------------------- \n");
        printf("0. Выход \n");
        scanf("%d", &menu);
        switch (menu)
        {
        case 1:
        {
            printf("Введите размеры массива (ширина, высота) \n");
            scanf("%d %d", &w, &h); // Ввод с клавиатуры количества столбцов и строк массива
            int ** mas = createMas(h, w);
        }
        break;
        case 2:
        {
            setMasManually(mas, h, w);
        }
        break;
        case 3:
        {
            setMasRandom(mas, h, w);
        }
        break;
        case 4:
        {
            printMas(mas, h, w);
        }
        break;
        case 0:
        {
            deleteMas(mas, h);
        }
            break;
        default:
        {
            printf("Неверный пункт меню \n");
        }
        }
    } while (menu != 0);
 
    return 0;
}
 
int ** createMas(int h, int w)
{
    int ** M = new int*[h]; 
 
    for (int i = 0; i < h; i++)
    {
        M[i] = new int[w];
    }
    return(M);
}
 
void setMasManually(int ** M, int h, int w)
{
    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            printf("Введите значение элемента A[%d][%d] \n", i, j);
            scanf("%d", &M[i][j]); // Ручной ввод элементов
        }
    }
}
 
void setMasRandom(int ** M, int h, int w)
{
    srand(time(NULL)); // Генератор случайных чисел
 
    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            M[i][j] = rand() % 10; // Присваивание элементам массива случайных значений от 0 до 9
        }
    }
}
 
void printMas(int** M, int h, int w)
{
    printf("Ваш массив: \n");
 
    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            printf("%d ", M[i][j]); // Вывод полученного массива на экран
        }
        printf("\n");
    }
}
 
void deleteMas(int** M, int h)
{
    for (int i = 0; i < h; i++)
    {
        delete[] M[i]; // Освобождение памяти из-под массива 
    }
 
    delete[] M; // Освобождение памяти из-под массива указателей
}
Компиляция проходит без ошибок (в Microsoft Visual Studio Community 2015), программа запускается, первый пункт меню (создание массива по заданным размерам) выполняется без проблем, но при попытке выполнить пункты 2 или 3 (заполнение массива) программа выдаёт ошибку:

Вызвано исключение: нарушение доступа для чтения.
M было 0x1110112


Ошибка вызывается на 92 строке при заполнении массива вручную и 105 строке при заполнении случайными числами. Как я понял, проблема связана с неправильным объявлением или обращением к переменной mas внутри блока switch, потому что аналогичный код, но с последовательным выполнением функций, без меню работает без ошибок (привожу только функцию main, всё остальное остаётся без изменений):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    setlocale(LC_ALL, "Russian");
    setlocale(LC_ALL, "rus");
 
    int w = 0, h = 0;
 
    printf("Введите размеры массива (ширина, высота) \n");
    scanf("%d %d", &w, &h); // Ввод с клавиатуры количества столбцов и строк массива
    int ** mas = createMas(h, w);
 
    //setMasManually(mas, h, w); // Можно включить либо эту, либо следующую функцию
    setMasRandom(mas, h, w);
    
    printMas(mas, h, w);
    deleteMas(mas, h);
    
    getchar();
    getchar();
        
    return 0;
}
Я заранее извиняюсь, если проблема оказалась слишком простой, но пока в программировании я почти полный ноль и буду рад любой помощи по выходу из этой ситуации.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2016, 12:37     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы
Посмотрите здесь:

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

Вызвано исключение: нарушение доступа для чтения. s было 0x1110112 - C++
Товарищи форумчане, нужна ваша помощь! (Для простоты объяснения прикреплю скрин) Насколько я понимаю, проблема заключается в том,...

Вызвано исключение: нарушение доступа для записи - C++
Не пойму в чем ошибка.MVS 2015. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; class...

Вызвано исключение: нарушение доступа для записи. . было 0xCCCCCCCC - C++
Знающие люди, объясните как при помощи структур реализовать данную функцию. Как я понял, элементы массива записываются, а индексы не могут...

Ошибка при вводе массива: "Вызвано исключение: нарушение доступа для записи" - C++
Здравствуйте, имеется вот такая программа, при вводе третьего массива(Массив B) выкидывает ошибку &quot;Вызвано исключение: нарушение доступа...

Вызвано исключение по адресу 0x01361A1E в Matrix 1.0.exe: 0xC0000005: нарушение прав доступа при записи - C++
Вызвано исключение по адресу 0x01361A1E в Matrix 1.0.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xCDCDCDCD. Если для...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
Эксперт C
15841 / 10168 / 1522
Регистрация: 24.12.2010
Сообщений: 19,175
29.04.2016, 12:56     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы #2
Infinitesimal, Строчка 41
C++
1
int ** mas = createMas(h, w);
Это mas не имеет никакого отношения к тому, которое объявлено на строке 21. Это локальная переменная блока
C++
1
2
3
4
5
6
case 1:
        {
            printf("Введите размеры массива (ширина, высота) \n");
            scanf("%d %d", &w, &h); // Ввод с клавиатуры количества столбцов и строк массива
            int ** mas = createMas(h, w);
        }
Кликните здесь для просмотра всего текста
Надо
C++
1
mas = createMas(h, w);

Не спешите нажимать на плюсик. Подумайте сами.
jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 518
Завершенные тесты: 1
29.04.2016, 12:58     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы #3
Цитата Сообщение от Infinitesimal Посмотреть сообщение
int ** mas = createMas(h, w);
int** убери а то заново объявляешь
Байт
Эксперт C
15841 / 10168 / 1522
Регистрация: 24.12.2010
Сообщений: 19,175
29.04.2016, 13:00     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы #4
И не вредно будет повторить раздел "Область действия переменных"
Удачи!

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от jurok_85 Посмотреть сообщение
int** убери а то заново объявляешь
Ну вот! Вся моя "педагогика" псу под хвост!

Infinitesimal
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 2
29.04.2016, 13:30  [ТС]     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы #5
Да, мне ещё учиться и учиться. Спасибо за подсказку!
Байт
29.04.2016, 13:37     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы
  #6

Не по теме:

Цитата Сообщение от Infinitesimal Посмотреть сообщение
мне ещё учиться и учиться.
Как поется в одной моей любимой песенке
Не оставляйте стараний, маэстро,
Не убирайте ладони со лба.

Yandex
Объявления
29.04.2016, 13:37     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы
Ответ Создать тему
Опции темы

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