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

Ошибка run-time check failure #2 - stack around the variable 'findmonths' was corrupted - C++

Восстановить пароль Регистрация
 
aleks_pilipenko
)))
 Аватар для aleks_pilipenko
602 / 179 / 9
Регистрация: 31.12.2009
Сообщений: 2,291
Записей в блоге: 3
13.06.2012, 14:12     Ошибка run-time check failure #2 - stack around the variable 'findmonths' was corrupted #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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <conio.h>
#include <string.h>
#include <windows.h>
 
char *filename="c:/meteo.dat";
char *Months[12] = {"Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"};
char *Veters[8] = {"Северный","Северо-восточный","Восточный","Юго-восточный","Южный","Юго-западный","Западный","Северо-западный"};
 
struct meteo{                               //структура записи
    char DateChislo[3];                     //Число
    int DateMonth;                          //Месяц
    double precipitation;                   //Количество осадков
    int windDirection;                      //Направление ветра
    double humidity;                        //Влажность
    int temperature;};                      //Температура
    int nCount;  //переменная для хранения количества дат в списке
void showMenu()
{
    cout<<"Выберете действие:"<<endl;
    cout<<"1. Ввести элементы списка\n2. Преобладающее направление ветра для заданного "
        "времени года(осень, зима, весна, лето)\n3. Наиболее засушливый месяц\n4. "
        "Средняя температура заданного месяца\n5. Удалить запись\n6. "
        "Наиболее влажный месяц\n7. Выйти"<<endl;
}
//начальная инициализация файла библиотеки
void initLib()
{
    FILE *fp=fopen(filename,"r");
    if (fp==NULL) //если файл не существует
    {
        nCount=0;
        fp=fopen(filename,"w");  //создаем его
        if(fp==NULL)
        {cout<<"Ошибка создания файла библиотеки. Программа будет закрыта!";
         _getch();
         exit(1);
        }
        fwrite(&nCount, sizeof(int), 1, fp);   //заносим в начало нового файла количество записей в нем - 0
    }
    else fread(&nCount, sizeof(nCount), 1, fp); //из существующего файла считываем количество записей
    fclose(fp);
}
//функция добавления новой даты в конец файла
void addDay()
{
    FILE *fp;
    meteo b;
    char ch;
    fp=fopen(filename,"r+");
    if(fp==NULL)cout<<"Ошибка чтения данных из файла";
    else
        {
            bool go=true;
            do
            { //вводим информацию об очередной записи
                system("cls"); 
                cin.sync();
                cout<<"Введите данные"<<endl;
                cout<<"Число: \t" ; cin.getline(b.DateChislo , 3);
                go=true;
                while(go)
                    {
                        int Mesyaz;
                        cout<<"Месяц укажите цифрой:\n";
                        for(int i=0;i<12;i++)cout<<i+1<<" - "<<Months[i]<<endl;
                        cin>>Mesyaz;
                        if(Mesyaz>0 && Mesyaz<13){go=false;b.DateMonth=Mesyaz-1;}
                        else cout<<"Неверный ввод!!!"<<endl;
                    }
                cout<<"\nКоличество осадков: \t"; cin>>b.precipitation;
                go=true;
                while(go)
                    {
                        int Veter;cout<<"\nНаправление ветра укажите цифрой:\n";
                        for(int i=0;i<8;i++)cout<<i+1<<" - "<<Veters[i]<<endl;
                        cin >> Veter;
                        if(Veter>0 && Veter<9){go=false;b.windDirection=Veter-1;}
                        else cout<<"Неверный ввод!!!"<<endl;
                    }
                cout<<"Влажность: \t" ; cin>>b.humidity;
                cout<<"Температура: \t" ; cin>>b.temperature;
                nCount++;   //заносим информацию об очередной записи в конец файла
                fseek(fp,0,SEEK_END);
                fwrite(&b, sizeof(meteo), 1, fp);//заносим информацию о количестве записей в начало файла
                fseek(fp,0,SEEK_SET);
                fwrite(&nCount, sizeof(int), 1, fp);
                cout<<"\nВвести данные о еще одной дате (д/н)?";
                ch=_getche();
            }while(ch=='Д' || ch=='д'); //можно ввести данные о нескольких датах
   fclose(fp);
  }
   cout<<endl;
}
 
//Наиболее засушливый месяц
void findDriestMonth()
{
    meteo b;int driestMonth = 0, numberOfMonth = 0;
    FILE *fp=fopen(filename,"r");
    int findMonths[12];
    memset(findMonths,0,48);
    if(fp==NULL)cout << "Ошибка чтения данных из файла" << endl;
    else
        {
            fread(&nCount, sizeof(int), 1, fp);
            for(int i=0;i<nCount;i++) //перебираем все даты из файла
            {
                fread(&b, sizeof(meteo), 1, fp);//проверяем считанную дату на соответствие месяцу
                findMonths[b.DateMonth-1] += b.precipitation;
            }
            for(int i=0; i<12; i++) if(driestMonth < findMonths[i]) {driestMonth = findMonths[i];numberOfMonth = i; }
            char* hh = Months[numberOfMonth];
            cout << "Самый засушливый месяц: " << hh << endl;
        }
        fclose(fp);
}
int main()
{
    SetConsoleCP(1251);  //Устанавливаем кодировку для ввода
    SetConsoleOutputCP (1251); //Устанавливаем кодировку для вывода
    setlocale(LC_ALL, "Russian");
    char* fff = Months[0];
    char ch='0';
    initLib();   
    showMenu();    //выводим меню
    ch=_getch();
    while(ch!='7')
    {
         switch(ch)     //в зависимости от выбора пользователя вызываем функцию
        {
            case '1': addDay();break;
            //case '2': findveter();break;
            case '3': findDriestMonth();break;
            //case '4': averagetemperaturmonth();break;
            //case '5': delBook();break;
            //case '6': findBook(1); break;
            //case '7': findBook(2); break;
            default: cout<<"Неверный ввод!!!"<<endl;
        }
        cout<<"Нажмите любую клавишу...";
        _getch();
        system("cls"); 
        showMenu();      //выводим меню
        ch=_getch();
    }
    return 0;}
После заполнения файла, нажимаю: Наиболее засушливый месяц он находит все как надо, но перед выходом из void findDriestMonth() выдает эту ошибку, что делать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 14:12     Ошибка run-time check failure #2 - stack around the variable 'findmonths' was corrupted
Посмотрите здесь:

C++ Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted
C++ Ошибка: Run-Time Check Failure #2 - Stack around the variable 'tmp' was corrupted.
C++ Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
C++ заполнение структуры, где-то ошибка run-time check failure #2 stack around the variable a was corrupted
Run-Time Check Failure #2 - Stack around the variable 'C' was corrupted C++
C++ Run-Time Check Failure #2 - Stack around the variable 'A' was corrupted
Run time check failure #2 stack around the variable was corrupted C++
C++ Ошибка Run-Time Check Failure #2 - Stack around the variable 'B' was corrupted

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 14:39     Ошибка run-time check failure #2 - stack around the variable 'findmonths' was corrupted #2
Обратите внимание, в b.DateMonth у Вас попадают значения 0..11, т.к.
C++
1
if(Mesyaz>0 && Mesyaz<13){go=false;b.DateMonth=Mesyaz-1;}
А затем Вы еще раз вычитаете единицу при записи в массив:
C++
1
findMonths[b.DateMonth-1] += b.precipitation;
В результате для всех январских дат Вы модифицируете findMonths[-1], то есть 4 байта перед массивом, о чем Вам и сообщает эта ошибка.
aleks_pilipenko
)))
 Аватар для aleks_pilipenko
602 / 179 / 9
Регистрация: 31.12.2009
Сообщений: 2,291
Записей в блоге: 3
13.06.2012, 14:47  [ТС]     Ошибка run-time check failure #2 - stack around the variable 'findmonths' was corrupted #3
Цитата Сообщение от soft.creator Посмотреть сообщение
В результате для всех январских дат Вы модифицируете findMonths[-1], то есть 4 байта перед массивом, о чем Вам и сообщает эта ошибка.
Спасибо! Быстро в коде разобрался...
Yandex
Объявления
13.06.2012, 14:47     Ошибка run-time check failure #2 - stack around the variable 'findmonths' was corrupted
Ответ Создать тему
Опции темы

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