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 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
#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 «
Хотелось бы узнать, как не допустить возникновение этой ошибки в дальнейшем.Что я сделал не так?Ничего не понимаю, что за ошибка проверки времени выполнения…Помогите
Прошу прощение за создание таких тем, но хотелось бы узнать в чем собственно заключается ошибка, что бы в дальнейшем избегать её…
Как видно по скринам программа просто не завершается.
Вот написал программу.
В нее задаются строки и размеры новых строк. потом она копирует заданные изначально строки в новые столько раз, чтоб в новой первоначальные строки повторялись, до тех пор пока длина новой строки не станет равной длине, заданной пользователем.(последнее вхождение можно укорачивать)
Например:
Дано:
строка: привет
длина: 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
-
Edited by
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
-
Marked as answer by