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

Ошибка компиляции:ОС Windows инициировала точку останова - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
MrGadik
0 / 0 / 0
Регистрация: 10.07.2010
Сообщений: 25
05.02.2012, 13:24     Ошибка компиляции:ОС Windows инициировала точку останова #1
Доброго времени суток!
Обращаюсь с наверняка очень распространенной проблемой.
Суть задачи такова:
Дан массив целых чисел. Назовем серией несколько подряд идущих элементов, а длиной серии - их количество. Преобразовать массив, поставив перед каждой серией наименьший элемент массива(длина серии может быть равна 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
#include "stdafx.h"
#include <conio.h>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
 
int min(int *mas, int n);
void work(int *mas, int n);
 
int _tmain(int argc, _TCHAR* argv[])
{
    int *mass;
    int n,i,a,b;
    cout << "\n Enter lenght of matrix:";
    cin >> n;
    cout << "\n Enter limits of generation:";
    cout << "\n a=";
    cin >> a;
    cout << "\n b=";
    cin >> b;
    srand(time(NULL)*1000);
    mass=new int[n];
    for (i=0;i<n;i++)
        mass[i]=rand()%(b-a)+a;
    cout << "\n Original massiv:\n";
    for(i=0;i<n;i++)
        cout << mass[i] << " ";
    cout << "\n\n Minimal element=" << min(mass, n);
    cout << "\n";
    cout << "\n Converteed massiv:\n";
    work(mass, n);
 
    free(mass);
    _getch();
    return 0;
}
 
 
int min(int *mas, int n)
{
    int i,min=mas[0];
    for (i=0; i<n; i++)
        if (min>mas[i]) min=mas[i];
    return min;
}
 
void work(int *mas, int n)
{
    int i,j,d=0,m,buf,x;
    m=min(mas,n);
    for (i=0;i<n+d;i++)
    {
        if (mas[i]!=mas[i-1])
        {   
            buf=mas[i];
            for (j=i;j<n+d;j++)
            {
                x=mas[j+1];
                mas[j+1]=buf;
                buf=x;
            }
            d++;
            mas[i]=m;
            i++;
        }
    }
    for(i=0;i<n+d;i++)
        cout << mas[i] << " ";
}

И собственно работает все нормально, но вот незадача - выдает ошибку:
"ОС Windows инициировала точку останова в Ekz_2.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в Ekz_2.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Ekz_2.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки"


Насколько я знаю такие ошибки возникают при косяках с динамическими массивами разной степени тяжести. И вот ошибку эту найти не могу.
Скорее всего она находится где то в функции work.
Заранее спасибо!

P.S.: так же был бы очень благодарен если вы поможете мне оптимизировать эту самую функцию work, т.е. убрать всякие архитектурные излишества и ляпы. Ибо есть ощущение, что их там не мало.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
05.02.2012, 13:34     Ошибка компиляции:ОС Windows инициировала точку останова #2
Цитата Сообщение от MrGadik Посмотреть сообщение
for (i=0;i<n+d;i++)
Выход за границу.

Добавлено через 1 минуту
Цитата Сообщение от MrGadik Посмотреть сообщение
for (j=i;j<n+d;j++)
C++
1
if (mas[i]!=mas[i-1])
C++
1
2
x=mas[j+1];
mas[j+1]=buf;
C++
1
for(i=0;i<n+d;i++)
MrGadik
0 / 0 / 0
Регистрация: 10.07.2010
Сообщений: 25
07.02.2012, 09:51  [ТС]     Ошибка компиляции:ОС Windows инициировала точку останова #3
Цитата Сообщение от Chelioss Посмотреть сообщение
Выход за границу.
И как это исправить? И разве у динамического массива есть границы?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.02.2012, 12:56     Ошибка компиляции:ОС Windows инициировала точку останова #4
Цитата Сообщение от MrGadik Посмотреть сообщение
И разве у динамического массива есть границы?
А куда ж они денутся? Выделили N байт, всё, что за их пределами, программе не принадлежит.
MrGadik
0 / 0 / 0
Регистрация: 10.07.2010
Сообщений: 25
07.02.2012, 21:06  [ТС]     Ошибка компиляции:ОС Windows инициировала точку останова #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
А куда ж они денутся? Выделили N байт, всё, что за их пределами, программе не принадлежит.
эээм, а как больше выделить?
Может тут как то через второй массив лучше делать?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.02.2012, 21:07     Ошибка компиляции:ОС Windows инициировала точку останова #6
MrGadik, тут лучше делать через std::vector.
MrGadik
0 / 0 / 0
Регистрация: 10.07.2010
Сообщений: 25
07.02.2012, 23:18  [ТС]     Ошибка компиляции:ОС Windows инициировала точку останова #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
MrGadik, тут лучше делать через std::vector.


Где то я это уже слышалНет, к сожалению через вектор делать нельзя, ибо тема не освоена и будет палевно... Есть еще какие нибудь варианты как избавиться от ошибки?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,732
Записей в блоге: 3
08.02.2012, 02:17     Ошибка компиляции:ОС Windows инициировала точку останова #8
Цитата Сообщение от MrGadik Посмотреть сообщение
C++
1
2
3
4
5
6
int *mass; int n,i,a,b;
 cout << "\n Enter lenght of matrix:";
 cin >> n; cout << "\n Enter limits of generation:";
 cout << "\n a="; cin >> a; cout << "\n b="; cin >> b;
 srand(time(NULL)*1000);
 mass=new int[n];
на момент выделения памяти под массив, размер массива компилятору не известен
В моей небогатой еще, практике компилируется если:
const int n=123;
//***************
//***************
mass=new int[n];
Впрочем, с/c++, - такой богатый, а я, - такой бэдный
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
08.02.2012, 03:17     Ошибка компиляции:ОС Windows инициировала точку останова #9
Если честно, я так и не понял, где задается длина серии. Или она вычисляется по ходу выполнения программы? Тогда другой вопрос
Цитата Сообщение от MrGadik Посмотреть сообщение
Назовем серией несколько подряд идущих элементов
Каких элементов? Одинаковых? Возрастающих? Или убывающих?
MrGadik
0 / 0 / 0
Регистрация: 10.07.2010
Сообщений: 25
08.02.2012, 09:10  [ТС]     Ошибка компиляции:ОС Windows инициировала точку останова #10
Цитата Сообщение от IGPIGP Посмотреть сообщение
на момент выделения памяти под массив, размер массива компилятору не известен
Почему нет? ведь я же в начале ввожу n, а потом только mass=new int[n]

Добавлено через 4 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
Если честно, я так и не понял, где задается длина серии. Или она вычисляется по ходу выполнения программы? Тогда другой вопрос

Каких элементов? Одинаковых? Возрастающих? Или убывающих?
Одинаковых.
Ну я посчитал что длину серии вводить не нужно, если длина >=1 то проще ставить минимальный элемент перед каждым элементом в массиве и не ставить если предыдущий элемент равен ему:
C++
1
if (mas[i]!=mas[i-1])
Но не суть, можно написать и с учетом длины серии. Главное понять что с массивом делать, чтобы ошибка не вылетала)
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
08.02.2012, 09:34     Ошибка компиляции:ОС Windows инициировала точку останова #11
Цитата Сообщение от MrGadik Посмотреть сообщение
Главное понять что с массивом делать
Если вам так хочется использовать именно массив, но не std::vector, то каждый раз выделяйте новую память с помощью new, а потом двигайте элементы массива.

Можем лучше использовать список, а не массив?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,732
Записей в блоге: 3
08.02.2012, 14:27     Ошибка компиляции:ОС Windows инициировала точку останова #12
Цитата Сообщение от MrGadik Посмотреть сообщение
Почему нет? ведь я же в начале ввожу n, а потом только mass=new int[n]
Мое предположение - потому, что компилятор в отличии от транслятора, распределяет память, до выполнения, и он не может отложить выполнение (сгенерировать кусочек Obj-файла) такого выражения:
C++
1
mass=new int[n];
Более того, если попробовать его "обмануть" зашив объявления типа:
const int n0=10;
const int n1=11;
//*********
const int n20=20;
в логический блок (Switch(n)) //n - переменная, а выберем константу
компилировать не будет ругаясь словами вроде "constant expression expected in..... in line.....".
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
08.02.2012, 18:37     Ошибка компиляции:ОС Windows инициировала точку останова #13
Динамический - не значит, что массив может расти или уменьшаться во время выполнения программы. Динамический - значит то, что память выделяется во время выполнения программы.
C++
1
int mas[];
- это статический массив. Для него память отводится в статической памяти. Эта память отводится программе во время компиляции этой программы. Отсюда следует, что для статического массива компилятор должен знать размер.

Динамический же массив
C++
1
int* ptr = new int[n];
создается в куче( свободной памяти, динамической памяти ). Эта динамическая память выделяется для программы при запуске этой программы. Отсюда следует, что размер знать во время компиляции не обязательно.

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Мое предположение - потому, что компилятор в отличии от транслятора, распределяет память, до выполнения, и он не может отложить выполнение (сгенерировать кусочек Obj-файла) такого выражения:
Где вы это прочитали?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,732
Записей в блоге: 3
08.02.2012, 22:49     Ошибка компиляции:ОС Windows инициировала точку останова #14
Н-да, глупость написал.
Попробовал в с++/clr предложенный код. Видно что проблема, в функции work()
a min() имеет в std однофамилицу с 3 аргументами (переименовал в minA() от греха )

Цитата Сообщение от MrGadik Посмотреть сообщение
if (mas[i]!=mas[i-1])
при i=0 не выходим за границы -> mas[-1]?

Цитата Сообщение от MrGadik Посмотреть сообщение
for(i=0;i<n+d;i++) cout << mas[i] << " ";
при d>0 не выходим за границы -> mas[n+d-1] (максимум mas[n-1])?
или я снова не понял

Добавлено через 11 минут
Прочел задачу - постановка не ясна,
Цитата Сообщение от MrGadik Посмотреть сообщение
Дан массив целых чисел. Назовем серией несколько подряд идущих элементов, а длиной серии - их количество. Преобразовать массив, поставив перед каждой серией наименьший элемент массива(длина серии может быть равна 1).
Поставить в начале каждой серии её наименьший элемент? (получаем массив того же размера, с некоторой перестановкой).
Или поставить наименьший элемент всего массива? - совсем тривиально и размер массива увеличивается (при серии - 1 элемент длина массива - вдвое).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 09:43     Ошибка компиляции:ОС Windows инициировала точку останова
Еще ссылки по теме:

C++ Ошибка (вызвали срабатывание точки останова)
C++ Ошибка. ОС Windows инициировала точку останова в файле
Windows инициировала точку останова при очистке динамической памяти C++

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

Или воспользуйтесь поиском по форуму:
MrGadik
0 / 0 / 0
Регистрация: 10.07.2010
Сообщений: 25
09.02.2012, 09:43  [ТС]     Ошибка компиляции:ОС Windows инициировала точку останова #15
Цитата Сообщение от IGPIGP Посмотреть сообщение

Поставить в начале каждой серии её наименьший элемент? (получаем массив того же размера, с некоторой перестановкой).
Или поставить наименьший элемент всего массива? - совсем тривиально и размер массива увеличивается (при серии - 1 элемент длина массива - вдвое).
Виноват, серия - несколько подряд идущих одинаковых элементов. Соответственно и минимальный элемент всего массива, хотя я вроде бы это писал)



А вообще говоря я полный идиот)) Проблема решилась тем, что я задал статический локальный массив(на 100 элементов к примеру) в функции work и все операции проводил с ним) И все, ошибка исчезла)

большое всем спасибо что помогли разобраться!
Yandex
Объявления
09.02.2012, 09:43     Ошибка компиляции:ОС Windows инициировала точку останова
Ответ Создать тему
Опции темы

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