Необработанное исключение по адресу 0x00007FF6AD8E1173: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF
Код программы:
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
struct Month {
int countDay;
int countHour = 24;
int** monthTable;
};
int enterMonth(int*);
void randomGenerateArray(int**, int, int, int);
int main() {
SetConsoleOutputCP(1251);
Month mon;
int numbMonth = enterMonth(&mon.countDay);
//ініціалізація масиву
mon.monthTable = new int* [mon.countDay];
for (int i = 0; i < mon.countDay; i++) {
mon.monthTable[i] = new int[mon.countHour];
}
cout << "\nПрограма автоматично згенерує значення температури, відповідно до пори року\n";
randomGenerateArray(mon.monthTable, mon.countDay, mon.countHour, numbMonth);
return 0;
}
int enterMonth(int *countDay) {
int numbMonth;
while (true) {
cout << "Введіть номер місяця, протягом якого заміряли температуру: ";
cin >> numbMonth;
if (numbMonth > 0 && numbMonth <= 12) {
break;
}
else {
cout << "Число місяців - 12!\n";
}
}
if (numbMonth == 2) {
*countDay = 28;
}
else if (numbMonth == 1 || numbMonth == 3 || numbMonth == 5 || numbMonth == 7 || numbMonth == 8 || numbMonth == 10 || numbMonth == 12) {
*countDay = 31;
}
else if (numbMonth == 4 || numbMonth == 6 || numbMonth == 9 || numbMonth == 11) {
*countDay = 30;
}
return numbMonth;
}
void randomGenerateArray(int **arr, int day, int hours, int countMon) {
//установлює діапазони температури, відповідно до пори року
int max, min;
if (countMon <= 2 || countMon == 12) {
max = 35;
min = 25;
}
else if ((countMon <= 5 && countMon >= 3) || (countMon <= 11 && countMon >= 9)) {
max = 25;
min = 5;
}
else if (countMon <= 8 || countMon >= 6) {
max = 25;
min = -10;
}
srand(time(0));
for (int i = 0; i < day; i++) {
for (int j = 0; j < hours; i++) {
//наступний рядок викликає помилку
arr[i][j] = (rand() % max) - min;
}
}
}
Результат:
Необработанное исключение по адресу 0x00007FF6AD8E1173 в LabWork6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF.
Ответы (1 шт):
Автор решения: V-Mor
→ Ссылка
Вам всё портит одна маленькая опечатка во вложенном цикле:
for (int i = 0; i < day; i++) {
for (int j = 0; j < hours; i++) { // Здесь ведь должно быть j++
//наступний рядок викликає помилку
arr[i][j] = (rand() % max) - min;
}
}
В таком виде, как у Вас есть сейчас, счётчик цикла i у Вас наращивается в двух циклах, а проверяется только в одном, в результате чего выходит за границы массива. Замените во втором цикле i++ на j++ и всё заработает.
P.S. Используйте отладчик при возникновении таких исключений. Он укажет строку, в которой произошла ошибка и значения переменных на момент её возникновения, что позволит Вам самому находить подобные опечатки.