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

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

Восстановить пароль Регистрация
 
Infinitesimal
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 2
29.04.2016, 12:37     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы #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
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++
C++ Необработанное исключение. Нарушение прав доступа при чтении
Исключение Нарушение прав доступа при чтении C++
C++ При обращении к структуре из класса возникает исключение:нарушение прав доступа при записи. Почему?
Необработанное исключение: нарушение прав доступа при записи C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13951 / 8782 / 1221
Регистрация: 24.12.2010
Сообщений: 15,888
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
226 / 209 / 70
Регистрация: 21.02.2013
Сообщений: 494
29.04.2016, 12:58     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы #3
Цитата Сообщение от Infinitesimal Посмотреть сообщение
int ** mas = createMas(h, w);
int** убери а то заново объявляешь
Байт
 Аватар для Байт
13951 / 8782 / 1221
Регистрация: 24.12.2010
Сообщений: 15,888
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     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы
Ответ Создать тему

Метки
массивы, функции
Опции темы

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