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

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

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

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

29.04.2016, 12:37. Просмотров 414. Ответов 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;
}
Я заранее извиняюсь, если проблема оказалась слишком простой, но пока в программировании я почти полный ноль и буду рад любой помощи по выходу из этой ситуации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2016, 12:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы (C++):

Вызвано исключение: нарушение доступа для чтения - 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. Если для...

5
Байт
Эксперт C
16355 / 10631 / 1592
Регистрация: 24.12.2010
Сообщений: 20,279
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);

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

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

Не по теме:

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

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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2016, 13:37
Привет! Вот еще темы с ответами:

При реализации метода Хаффмана выскакивает исключение: нарушение доступа для чтения. root было 0xCDCDCDCD - C++
Здравствуйте! Разбираюсь с методом Хаффмана в Visual Studio, язык C++. Выскакивает исключение:нарушение доступа для чтения. root было...

Вызвано исключение по адресу 0x013C1891 в Jacobi.exe: 0xC0000005: нарушение прав доступа при чтении по адресу - C++
#include &lt;math.h&gt; const double eps = 0.001; ///&lt; желаемая точность /// N - размерность матрицы; A - матрица коэффициентов, F -...

Необработанное исключение нарушение прав доступа - C++
Можно ли отловить исключение, которое потом выдает компилятор как &quot;необработанное исключение нарушение прав доступа&quot; Если можно, то как? ...

Ошибка обращения к строке (нарушение прав доступа чтения) - C++
Добрый всем день немогу разобраться что за ошибка и как ее локализовать код и скрин прикреплены


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

Или воспользуйтесь поиском по форуму:
6
29.04.2016, 13:37
Ответ Создать тему
Опции темы

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