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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Вывести старший и младший байт заданного целого положительного числа в шестнадцатиричном и двоичном виде http://www.cyberforum.ru/cpp-beginners/thread1723964.html
Дано целое положительное число , тип int. Вывести старший и младший байт в 16ом и в 2ом виде.
C++ Вывести на экран озера заинтересовавшие Вас диапазоном глубин Учитель географии создал базу данных , с указанием некоторых крупнейших природных пресных озер мира с такими сведениями: название озера , континент , страна , площадь , наибольшая глубина . Вывести на экран озера заинтересовавшие Вас диапазоном глубин. Пример базы данных: http://www.cyberforum.ru/cpp-beginners/thread1723960.html
структура дерево C++
помогите найти ответ, дано: struct tree{ int var; tree *m;}; int P22 (tree *p){ if (p==NULL) return 0; int s=p->var; for (int i=0; i<4; i++) s+=P22(p->m); return s;
Написать программу: работа со структурой "сотрудник" C++
Дан массив данных о работниках фирмы: ФИО и дата поступления на ра-боту (месяц, год). Сформировать стек, в который попадут данные тех из них, кто на сегодняшний день проработал уже не менее 5 лет.
C++ Двумерный массив и сравнение строк http://www.cyberforum.ru/cpp-beginners/thread1723920.html
Дана целочисленная матрица размера M x N. Различные строки матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках. Найти количество строк, похожих на последнюю строку. Массив создала, а как написать функцию для сравнения строк с последней никак не пойму, помогите пожалуйста :( (числа в массиве из интервала (-10; 10)) #include <iostream> #include <cstdlib>...
C++ Сортировка Шелла и пирамидальная сортировка для символов Здраствуйте, можете пожалуйста привести пример сортировок шелла и пиромидальной сортировки для символов, а то ничего не могу найти в интернете подробнее

Показать сообщение отдельно
Infinitesimal
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 2
29.04.2016, 12:37     Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы
Здравствуйте. В процессе выполнения несложного учебного задания столкнулся с ошибкой. Подозреваю, что ошибка очень глупая и вызвана банальной некомпетентностью/невнимательностью, но уже третий день ничего не могу поделать. Поиск аналогичных проблем в интернете ничего не дал.

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

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;
}
Я заранее извиняюсь, если проблема оказалась слишком простой, но пока в программировании я почти полный ноль и буду рад любой помощи по выходу из этой ситуации.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru