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

Неожиданное завершение программы на Windows - C++

Восстановить пароль Регистрация
 
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 18:30     Неожиданное завершение программы на Windows #1
Вообщем такая беда, решал задачку с одного сайта, решал ее в облаке от Cloud9, там Ubuntu стоит. Все замечательно работает не придраться. При переносе в Windows(Пользуюсь CLion) программа неожиданно вылетает с ошибкой посреди выполнения своего кода. Сначала работала на Debug, а на Realese нет. Потом перестала работать в любом исполнении. Прошу кому не сложно, посмотреть опытным взглядом и ткнуть носом в ошибки, сразу предупреждаю что я новичок, поэтому ошибки скорее всего банальные.
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
#include <iostream>
#include <time.h>
#include <iomanip>
 
using namespace std;
 
//Прототипы функций
void random_massive(float, float);
void print_massive(void);
void find_min(void);
void sort_matrix(void);
float random_number(float, float);
 
float massive[9][9];
int number_s0; //Храним номер строки для перестановки
 
int main() {
    cout << fixed;
    cout << setprecision(4); //Устанавливаем точность для всех выводимых чисел, только для cout
    srand(time(NULL)); //Для полной рандомизации генерируемых чисел
    float n0, n1; //Переменные диапазона чисел
    cout << "Введите диапазон генерируемых чисел" << endl;
    cout << "Укажите нижний предел:" << endl;
    cin >> n0;
    cout << "Укажите верхний предел:" << endl;
    cin >> n1;
    random_massive(n0,n1); //Вызов функции генерации массива по заданным параметрам
    cout << "Массив 10x10:" << endl;
    print_massive(); //Вызов функции вывода готового массива на экран
    cout << endl;
    find_min(); //Находим минимальный элемент
}
 
//Функция - Генератор массива со случайными числами
void random_massive(float a, float b)
{
    for(int s = 0; s < 10; s++) { //Пока не дошли до 10й строки...
        for(int i = 0; i < 10; i++) { //Перебираем элементы в строке по индексам до 10го
            massive[s][i] = random_number(a, b); //Запись в массив случайного числа
        }
    }
}
 
//Функция - Генератор случайных чисел
float random_number(float N0, float N1)
{
    float precision = 1.0 / (1.0 + rand() % 50); //Нахождение дробной части
    int spray = N1 - N0; //Вычисление диапазона допустимых чисел
    float number = ((N0 + (rand() % spray)) + precision); //Складываем все вместе и получаем случайное число в заданном диапазоне
    return number; //Возвращаем случайное число с дробной частью
}
 
//Функция - Вывод массива на экран в удобной для чтения форме
void print_massive(void)
{
    for(int s = 0; s < 10; s++) { //Пока не дошли до 10й строки...
        for(int i = 0; i < 10; i++) { //Перебираем элементы в строке по индексам до 10го
            cout << "\t" << massive[s][i]; //Выводим каждый элемент отдельно пользователю. 3 знака после запятой
        }
        cout << endl; //Когда строка закончилась, начинаем новую
    }
}
 
//Функция - Поиск наименьшего элемента
void find_min(void)
{
    int number_s;
    float min = massive[0][0];
    for(int s = 0; s < 10; s++) { //Пока не дошли до 10й строки...
        for(int i = 0; i < 10; i++) { //Перебираем элементы в строке по индексам до 10го
           if(massive[s][i] < min) { //Если текущий элемент меньше чем min
               min = massive[s][i]; //Записываем его в min
               number_s = s;
           }
        }
    }
    number_s0 = number_s; //Сохраняем номер строки для перестановки
    printf("Минимальный элемент %f, в строке под номером %i", min, number_s); //Вывод результата. Считать от 0!
    cout << endl;
    sort_matrix();
}
 
void sort_matrix(void)
{
    float old_s[9]; //Массив для временного хранения первой строки
    if(number_s0 != 0) { //Если нужно переместить не первую строку
        for(int i = 0; i < 10; i++) { //Перебираем элементы в строке по индексам до 10го
          old_s[i] = massive[0][i]; //Сохраняем первую(0) строку массива, во временный массив
          massive[0][i] = massive[number_s0][i]; //Переносим нужную строку на место первой
          massive[number_s0][i] = old_s[i]; //И записываем на место строки, которую уже переместили, строку которую мы спасли
        }
    }
    print_massive(); //Выводим массив на экран
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 18:30     Неожиданное завершение программы на Windows
Посмотрите здесь:

C++ Аварийное завершение программы
C++ завершение программы
Принудительное завершение программы C++
Завершение программы с кодом C++
C++ Аварийное завершение работы программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:31     Неожиданное завершение программы на Windows #2
Код ошибки в студию!
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 18:34  [ТС]     Неожиданное завершение программы на Windows #3
Цитата Сообщение от TheBig Посмотреть сообщение
Код ошибки в студию!
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: untitled.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 579b7336
Имя модуля с ошибкой: untitled.exe
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 579b7336
Код исключения: c0000005
Смещение исключения: 000017c5
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:36     Неожиданное завершение программы на Windows #4
проблема с массивом, где то индекс не совпадает
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 18:42  [ТС]     Неожиданное завершение программы на Windows #5
Цитата Сообщение от TheBig Посмотреть сообщение
проблема с массивом, где то индекс не совпадает
Проверил все вдоль и поперек, все с индексами хорошо по моему скромному мнению. Тем более с ubuntu никаких проблем не возникает. Не думаю что дело в разных компиляторах: На Ubuntu стоит G++, у меня на Windows 10 стоит MinGW.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
29.07.2016, 18:42     Неожиданное завершение программы на Windows #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от IrishSilvan Посмотреть сообщение
Прошу кому не сложно, посмотреть опытным взглядом и ткнуть носом в ошибки
вот так вы объявляете глобальный массив:
C++
1
float massive[9][9];
а вот так потом его сортируете:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void sort_matrix(void)
{
    float old_s[9]; 
    if(number_s0 != 0) { 
        for(int i = 0; i < 10; i++) { // <--- выход за пределы диапазона
          old_s[i] = massive[0][i]; 
          massive[0][i] = massive[number_s0][i]; 
          massive[number_s0][i] = old_s[i]; 
        }
    }
    print_massive(); //Выводим массив на экран
}
лекарство:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void sort_matrix(void)
{
    //Массив для временного хранения первой строки
    float old_s[9]; 
    
    //Если нужно переместить не первую строку
    if(number_s0 != 0) { 
        //Перебираем элементы в строке по индексам до 10го
        for(int i = 0; i < 9; i++) {
 
            //Сохраняем первую(0) строку массива, во временный массив
            old_s[i] = massive[0][i]; 
 
            //Переносим нужную строку на место первой
            massive[0][i] = massive[number_s0][i]; 
 
            //И записываем на место строки, которую уже переместили, строку которую мы спасли
            massive[number_s0][i] = old_s[i]; 
        }
    }
    //Выводим массив на экран
    print_massive(); 
}
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:45     Неожиданное завершение программы на Windows #7
Цитата Сообщение от IrishSilvan Посмотреть сообщение
Проверил все вдоль и поперек, все с индексами хорошо
не, вот hoggy нашел ошибку
Цитата Сообщение от hoggy Посмотреть сообщение
<--- выход за пределы диапазона
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 19:04  [ТС]     Неожиданное завершение программы на Windows #8
Спасибо за ответ действительно помогло, ошибка исчезла, но обнаружилась другая, либо я ее не замечал, либо она появилась только сейчас, и на ubuntu, и на windows. В строго определенном месте всплывают нули, вне зависимости от того какой диапазон чисел выбран.
Код
irishsilvan:~/workspace $ ./matrix
Введите диапазон генерируемых чисел
Укажите нижний предел:
1
Укажите верхний предел:
8
Массив 10x10:
        2.0625  1.3333  7.0500  6.1111  3.0667  7.5000  5.0278  2.0385  1.0294  1.0909
        1.0909  2.0263  1.5000  6.0204  2.0714  6.0385  1.0714  6.0769  2.0385  4.0455
        4.0455  2.1667  6.0233  3.0909  6.0263  4.0294  4.0278  6.0769  1.0909  3.0256
        3.0256  3.1429  3.0769  7.0256  4.0238  6.0345  3.0333  3.0370  5.0667  7.0238
        7.0238  2.1667  7.2500  5.0667  7.0303  1.0233  3.1429  1.0357  7.0455  6.0200
        6.0200  5.0323  2.0500  1.3333  4.0222  1.0256  2.0312  4.0667  3.0625  3.3333
        3.3333  7.0455  7.0227  1.0333  5.0588  7.0323  4.0400  2.0204  5.0526  3.5000
        3.5000  1.0200  1.0588  5.0455  5.0222  3.0323  3.0500  1.1000  8.0000  7.0323
        7.0323  2.0294  3.0370  8.0000  1.0294  5.1429  7.5000  7.0417  5.0455  6.0455
        6.0455  5.0556  2.0278  1.1667  5.0476  7.2500  6.5000  6.1429  7.0435  6.0417

Минимальный элемент 1.020000, в строке под номером 7
        3.5000  1.0200  1.0588  5.0455  5.0222  3.0323  3.0500  1.1000  8.0000  1.0909
        1.0909  2.0263  1.5000  6.0204  2.0714  6.0385  1.0714  6.0769  2.0385  4.0455
        4.0455  2.1667  6.0233  3.0909  6.0263  4.0294  4.0278  6.0769  1.0909  3.0256
        3.0256  3.1429  3.0769  7.0256  4.0238  6.0345  3.0333  3.0370  5.0667  7.0238
        7.0238  2.1667  7.2500  5.0667  7.0303  1.0233  3.1429  1.0357  7.0455  6.0200
        6.0200  5.0323  2.0500  1.3333  4.0222  1.0256  2.0312  4.0667  3.0625  3.3333
        3.3333  7.0455  7.0227  1.0333  5.0588  7.0323  4.0400  2.0204  5.0526  2.0625
        2.0625  1.3333  7.0500  6.1111  3.0667  7.5000  5.0278  2.0385  1.0294  7.0323
        7.0323  2.0294  3.0370  8.0000  1.0294  5.1429  7.5000  7.0417  5.0455  0.0000
        0.0000  5.0556  2.0278  1.1667  5.0476  7.2500  6.5000  6.1429  7.0435  6.0417
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
29.07.2016, 19:13     Неожиданное завершение программы на Windows #9
Цитата Сообщение от IrishSilvan Посмотреть сообщение
но обнаружилась другая
аналогично - выход за пределы диапазона.

C++
1
2
3
4
5
6
7
8
9
//Функция - Генератор массива со случайными числами
void random_massive(float a, float b)
{
    for(int s = 0; s < 10; s++) { //Пока не дошли до 10й строки...
        for(int i = 0; i < 10; i++) { //Перебираем элементы в строке по индексам до 10го
            massive[s][i] = random_number(a, b); //Запись в массив случайного числа
        }
    }
}
здесь тоже:

C++
1
2
3
4
5
6
7
8
9
10
//Функция - Вывод массива на экран в удобной для чтения форме
void print_massive(void)
{
    for(int s = 0; s < 10; s++) { //Пока не дошли до 10й строки...
        for(int i = 0; i < 10; i++) { //Перебираем элементы в строке по индексам до 10го
            cout << "\t" << massive[s][i]; //Выводим каждый элемент отдельно пользователю. 3 знака после запятой
        }
        cout << endl; //Когда строка закончилась, начинаем новую
    }
}
ошибка везде одна и та же.

Добавлено через 2 минуты
здесь тоже самый выход за пределы диапазона:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Функция - Поиск наименьшего элемента
void find_min(void)
{
    int number_s;
    float min = massive[0][0];
    for(int s = 0; s < 10; s++) { //Пока не дошли до 10й строки...
        for(int i = 0; i < 10; i++) { //Перебираем элементы в строке по индексам до 10го
           if(massive[s][i] < min) { //Если текущий элемент меньше чем min
               min = massive[s][i]; //Записываем его в min
               number_s = s;
           }
        }
    }
    number_s0 = number_s; //Сохраняем номер строки для перестановки
    printf("Минимальный элемент %f, в строке под номером %i", min, number_s); //Вывод результата. Считать от 0!
    cout << endl;
    sort_matrix();
}
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 19:23  [ТС]     Неожиданное завершение программы на Windows #10
Огромное спасибо, все исправилось, виной моя элементарная невнимательность. Массивы хотел получить 10х10, а размерность задал 9х9, исправил везде размерность массивов и все заработало, большое спасибо, исправления в циклах не потребовались.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 22:09     Неожиданное завершение программы на Windows
Еще ссылки по теме:

Неожиданное закрытие консольной программы C++
C++ Неожиданное завершение программы
C++ Завершение программы

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

Или воспользуйтесь поиском по форуму:
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 22:09     Неожиданное завершение программы на Windows #11
да не за что! для нас это пустяковое дело. обращайтесь в любое время, мы на месте
Yandex
Объявления
29.07.2016, 22:09     Неожиданное завершение программы на Windows
Ответ Создать тему
Опции темы

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