Ошибка run time check failure

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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <stdio.h>
#include <stdlib.h>
#include <TPerfMeter.h>
#define size 10000
struct tan {
    char ak[14];
    char pl[14];
    int cl;
};
struct elem {
    tan data;
    elem *next;
};
enum bol {NO,YES};
void insert(tan el,elem *ht[],int s);
bol member(tan el,elem *ht[],int s);
void makenull(elem *ht[],int s) {
    int i;
    for (i=0;i<=s;i++)
        ht[i]=NULL;
}
void rebuild(elem *ht[],int s,elem *dht[]) {
    int i;
    elem *curr;
    for (i=0;i<=s;i++) {
        curr=ht[i];
        while (curr!=NULL) {
            insert(curr->data,dht,size*2-1);
            curr=curr->next;
        }
    }
}
int h(tan el,int s) {
    int i;
    int sum1=0,sum2=0;
    for (i=0;i<=14;i++) {
        sum1=sum1+el.ak[i];
        sum2=sum2+el.pl[i];
    }
    return ((sum1*sum2+el.cl)%s);
}
void insert(tan el,elem *ht[],int s) {
    int bucket;//номер сегмента
    elem *oldheader;
    if(!member(el,ht,s)) {
        bucket=h(el,s);
        oldheader=ht[bucket];
        ht[bucket]=new elem();
        ht[bucket]->data=el;
        ht[bucket]->next=oldheader;
    }
}
bol member(tan el,elem *ht[],int s) {
    elem *curr;
    curr=ht[h(el,s)];
    while (curr!=NULL) {
        if (curr->data.ak==el.ak) return (YES);
        else curr=curr->next;
    }
    return (NO);
}
elem *goe(tan el,elem *ht[],int s) {
    elem *curr;
    curr=ht[h(el,s)];
    while (curr!=NULL) {
        if (curr->data.ak==el.ak) return (curr);
        else curr=curr->next;
    }
    return (NULL);
}
void del(tan el,elem *ht[],int s) {
    int bucket=h(el,s);
    elem *curr;
    if (ht[bucket]!=NULL) {
        if (ht[bucket]->data.ak==el.ak)
            ht[bucket]=ht[bucket]->next;
        else {
            curr=ht[bucket];
            while (curr->next!=NULL) {
                if (curr->next->data.ak==el.ak) {
                    curr->next=curr->next->next;
                    return;
                }
                else curr=curr->next;
            }
        }
    }
}
void ini(elem *ht[],elem *dht[],tan *el) {
    makenull(ht,size-1);
    makenull(dht,size*2-1);
    int j;
    for (j=0;j<=14;j++) {
        el->ak[j]=rand()%122;
        el->pl[j]=rand()%122;
    }
    el->cl=rand()%10000;
}
double instime(int elc) {
    elem *ht[size-1];
    elem *dht[size*2-1];
    bol htf=NO,chk=NO;
    int i,n=0;
    tan el;
    TPerfMeter pm;
    double interv=0;
    ini(ht,dht,&el);
    for (i=0;i<=elc-1;i++) {
        if (htf==NO) {
            pm.Start();
            insert(el,ht,size-1);
            interv=interv+pm.Stop();
        }
        else if (chk==NO) {
            rebuild(ht,size-1,dht);
            chk=YES;
            pm.Start();
            insert(el,dht,size*2-1);
            interv=interv+pm.Stop();
        }
        else {
            pm.Start();
            insert(el,dht,size*2-1);
            interv=interv+pm.Stop();
        }
        n++;
        if (n>=2*size-1) htf=YES;
    }
    return (interv);
}
double goet() {
    elem *ht[size-1];
    elem *dht[size*2-1];
    int i;
    tan el;
    TPerfMeter pm;
    double interv=0;
    ini(ht,dht,&el);
    for (i=0;i<=size-1;i++) insert(el,ht,size-1);
    pm.Start();
    goe(el,ht,size-1);
    interv=pm.Stop();
    return interv;
}
double deltime() {
    elem *ht[size-1];
    elem *dht[size*2-1];
    int i;
    tan el;
    TPerfMeter pm;
    double interv=0;
    ini(ht,dht,&el);
    for (i=0;i<=size-1;i++) insert(el,ht,size-1);
    pm.Start();
    del(el,ht,size-1);
    interv=pm.Stop();
    return interv;
}
void tfp() {
    printf("Insert time 10 elements: %fn",instime(10));
    printf("Insert time 100 elements: %fn",instime(100));
    printf("Insert time 1000 elements: %fn",instime(1000));
    printf("Insert time 10000 elements: %fn",instime(10000));
    printf("Insert time 20000 elements(+rebuilding hash table): %fn",instime(20000));
    printf("Delete one element time: %fn",deltime());
    printf("Get one element time: %fn",goet());
    getchar();
    getchar();
}
void main() {
    printf("1. Test for performancen");
    printf("0. Exitn");
    printf("Choose menu point: ");
    switch (getchar()) {
        case '1':tfp();
        case '0':break;
    }
}

Ошибка run-time check failure #2 — stack around the variable ‘a’ was corrupted. При дебаге он все хорошо делает, а в самом конце, когда результаты выданы и все хорошо он выдает эту ошибку. Не очень понимаю как это пофиксить. Может кто подсказать?

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

void minmax(int arrays[], int n);
void bubble(int arr[], int n);

void main() {
setlocale(LC_ALL, "Russian");
const int n = 21;
int a[n];
srand((unsigned int)time(NULL));
cout << "Исходный массив = ";
for (int i = 0; i < n; i++) {
    a[i] = 1 + rand() % 10;
    cout << a[i] << " ";
}
cout << endl;
minmax(a, n);
bubble(a, n);
}

void minmax(int arrays[], int l) {
int k = 0;
for (int i = 0; i < l; i++) {
    int min = arrays[i], imin = i;
    for (int j = i + 1; j < l; j++) {
        if (arrays[j] < min) {
            min = arrays[j];
            imin = j;
            k++;
        }
    }
    if (imin != i) {
        int t = arrays[i];
        arrays[i] = arrays[imin];
        arrays[imin] = t;
    }
}
cout << endl;
for (int i = 0; i < l; i++) {
    cout << arrays[i] <<

        " ";
}
cout << endl <<

    "Количество шагов в методе min max = " << k << endl << endl;
}

void bubble(int arr[], int n)
{
int check = 0, i = 0;
for (int k = 0; k < n; k++)
{
    if (arr[k] >= arr[k + 1])
    {
        int m = arr[k];
        arr[k + 1] = m;
    }
    i++;
}
for (int k = 0; k < n; k++)
{
    cout << arr[k] << " ";
}
cout << endl << "Количество шагов в методе пузырька = " << i << endl << endl;
 }

задан 6 окт 2016 в 20:27

Sasha Tianoutov's user avatar

Sasha TianoutovSasha Tianoutov

411 золотой знак2 серебряных знака6 бронзовых знаков

for (int k = 0; k < n; k++) {
    if (arr[k] >= arr[k + 1]) { /* <<< */
        int m = arr[k];
        arr[k + 1] = m;         /* <<< */
    }
    i++;
}

В помеченных строках вы вылезаете за границы массива.

P.S. И в очередной раз: valgrind, valgrind и если ещё не — valgrind!

ответ дан 6 окт 2016 в 20:35

PinkTux's user avatar

#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    int x = 0;
    int myArr[50];
    for (int i = 0; i < 100; i++) {
        myArr[i] = x++;
        if (myArr[i]%2 != 0){
            cout << myArr[i] << endl;
        }
        
    }
    return 0;
}

Задача программы заполнить массив из 50-ти элементов нечётными числами от 1 до 99.
Программа работает, но она не завершается, выводит сообщение » Вызвано исключение. Run-Time Check Failure #2 — Stack around the variable ‘myArr’ was corrupted «
Хотелось бы узнать, как не допустить возникновение этой ошибки в дальнейшем.Что я сделал не так?Ничего не понимаю, что за ошибка проверки времени выполнения…Помогите
Прошу прощение за создание таких тем, но хотелось бы узнать в чем собственно заключается ошибка, что бы в дальнейшем избегать её…
Как видно по скринам программа просто не завершается.
5da4d930b60be125615987.png
5da4d93d5d9d9695432884.png

Вот написал программу.
В нее задаются строки и размеры новых строк. потом она копирует заданные изначально строки в новые столько раз, чтоб в новой первоначальные строки повторялись, до тех пор пока длина новой строки не станет равной длине, заданной пользователем.(последнее вхождение можно укорачивать)
Например:
Дано:
строка: привет
длина: 10
результат:приветприв

#include <stdio.h>
#include <locale.h>
#include <conio.h>
#include <limits.h>
#include <string.h>
#include <Windows.h>

void FillStr(char *s, int N)
{
        char str[CHAR_MAX]; // массив, хранящий в себе новую строку
        str[0] = ;
        int kol = N / strlen(s); // kol — количество целых вхождений строки s в строку размера N
        for (int i = 0; i < kol + 1;i++) //копирование в конец новой строки
                strcat(str,s);
        for (int i = 0; i < N; i++)//вывод строки на экран
        {
                printf(«%c», str[i]);
        }
        printf(«n«);
}
void main()
{
                setlocale (LC_CTYPE, «rus»);
                char s[4][CHAR_MAX];//s — массив в котором хранятся строки
                int n[4]; //массив, хранящий длины новых строк
                printf(«Введите строки: «);
                for (int i = 0; i < 5; i++) //ввод строк
                        gets(s[i]);
                for(int i = 0; i < 5; i++) // перекодировка для возможности использования русского языка
                        OemToCharA(s[i],s[i]);
                printf(«Укажите длины конечных строк: «);
                for(int i = 0; i < 5; i++) // ввод длин новых строк
                {              
                        scanf(«%d», &n[i]);
                }
                for(int i = 0; i < 5; i++) // выполнение задачи
                        FillStr(s[i],n[i]);
        _getch();
}

программа работает но в конце выдает ошибку(после получения правильного результата):
«Run-Time Check Failure #2 — Stack around the variable ‘s’ was corrupted.»,
а если вытащить .ехе файл, то он тоже нормально выполнит, но потом выдаст это:
Изображение

  • Remove From My Forums
  • Question

  • When ending the program, I get the error: «Run-Time Check Failure #2 — Stack around the variable ‘exit’ was corrupted.» No idea how to stop the corruption… any ideas? EDIT: After posting on here, I saw exit highlighted, so I changed the variable to «ext».
    this did not solve my problem.

    void main()
    {
    	pid data;		
    	float co;
    	char exit;
    
    	data=data_input();
    	do					
    	{
    		printf("Please enter a PV: ");
    		scanf("%f", &data.pv);
    		co=calc_co(data);
    		printf("The CO is: %0.2f", co);
    		printf("nPress Y to continue (any other key to exit):");
    		scanf("%s", &exit);
    	}while(exit=='Y'||exit=='y');
    	flushall();
    	getchar();
    }

    • Edited by

      Wednesday, February 8, 2012 4:50 PM

Answers

  • Il 08/02/2012 17:43, CKTofu ha scritto:

    When ending the program, I get the error: «Run-Time Check Failure #2 — Stack around the variable ‘exit’ was corrupted.» No idea how to stop the corruption… any ideas? EDIT: After posting on here, I saw exit highlighted, so I changed the variable
    to ext. this did not solve my problem.

    What is «pid»?
    And what does data_input() do?
    The problem may be in data_input(), i.e. in sections of code you haven’t showed.

    Moreover, I suspect the scanf(«%s», &exit).
    exit is a char, not a string.
    You may want to use %c instead of %s:

    scanf(«%c», &exit);

    Giovanni

    • Marked as answer by
      CKTofu
      Wednesday, February 8, 2012 4:54 PM

Понравилась статья? Поделить с друзьями:
  • Ошибка rtc perco аппаратный сбой
  • Ошибка rt n11p что это такое
  • Ошибка rpc что это такое
  • Ошибка rss xml or pcre extensions not loaded
  • Ошибка rom ваз 2114 что это такое