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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
#1

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

29.07.2016, 18:30. Просмотров 290. Ответов 10
Метки нет (Все метки)

Вообщем такая беда, решал задачку с одного сайта, решал ее в облаке от 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(); //Выводим массив на экран
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 18:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неожиданное завершение программы на Windows (C++):

Неожиданное завершение программы - C++
простенькая программа, нужно ввести двумерный массив, после чего во втором массиве написать в iый элемент 1, если элементы iой строки 1ого...

Неожиданное закрытие консольной программы - C++
Делаю лично для себя программку находящая целочисленные корни уравнения 6-ой степени. Все написал, запускается без ошибок, а после ввода...

Неожиданное поведение программы: почему не работает цикл while? - C++
Проблема: Цикл While при != является бесконечным ,а при == не выполняется ни разу Ожидаемое поведение: После входа в цикл N должно быть...

Неожиданное поведение программы: исправить ошибку в коде - C++
извиняюсь за возможно глупый вопрос, но почему программа говорит,что в выделенной строке ошибка? хотел написать в ней: а в квадрате + в в...

Неожиданное поведение программы: почему не работает цикл do while? - C++
Здравствуйте,подскажите,пожалуйста,почему не работает цикл ... Условие корявое? //Напишите программу, которая по начальной сумме денег...

Неожиданное поведение программы: найти ошибку в коде - C++
Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите положительное число до 100. Программа должна выдать пол-ный ответ «...

10
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:31 #2
Код ошибки в студию!
0
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 18:34  [ТС] #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
0
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:36 #4
проблема с массивом, где то индекс не совпадает
0
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 18:42  [ТС] #5
Цитата Сообщение от TheBig Посмотреть сообщение
проблема с массивом, где то индекс не совпадает
Проверил все вдоль и поперек, все с индексами хорошо по моему скромному мнению. Тем более с ubuntu никаких проблем не возникает. Не думаю что дело в разных компиляторах: На Ubuntu стоит G++, у меня на Windows 10 стоит MinGW.
0
hoggy
6652 / 2838 / 486
Регистрация: 15.11.2014
Сообщений: 6,270
Завершенные тесты: 1
29.07.2016, 18:42 #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(); 
}
1
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:45 #7
Цитата Сообщение от IrishSilvan Посмотреть сообщение
Проверил все вдоль и поперек, все с индексами хорошо
не, вот hoggy нашел ошибку
Цитата Сообщение от hoggy Посмотреть сообщение
<--- выход за пределы диапазона
0
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 19:04  [ТС] #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
0
hoggy
6652 / 2838 / 486
Регистрация: 15.11.2014
Сообщений: 6,270
Завершенные тесты: 1
29.07.2016, 19:13 #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();
}
1
IrishSilvan
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
Завершенные тесты: 1
29.07.2016, 19:23  [ТС] #10
Огромное спасибо, все исправилось, виной моя элементарная невнимательность. Массивы хотел получить 10х10, а размерность задал 9х9, исправил везде размерность массивов и все заработало, большое спасибо, исправления в циклах не потребовались.
0
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 22:09 #11
да не за что! для нас это пустяковое дело. обращайтесь в любое время, мы на месте
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 22:09
Привет! Вот еще темы с ответами:

Вычислить значение функции (неожиданное поведение программы - как исправить?) - C++
Мне нужно вичислить значение функции у= (4*(x^3)-2*(x^2)+5);для значении x от -3 до 1.Написан такой код: #include&lt;stdio.h&gt; ...

Прохождение лабиринта: неожиданное поведение программы (найти и исправить ошибки) - C++
Всем доброго времени суток. В общем написал я программу для генерации лабиринта и программу для его прохождения. В первой генерирую...

Неожиданное поведение программы: почему программа внезапно завершает работу? - C++
Писал в codeblocks с компилятором gnu gcc. После запуска и ввода данных завершается работа программы. Словарь задан массивом...

Объяснить неожиданное поведение программы при использовании массивов и функции strcpy() - C++
Посмотрел в отладчике,получается,что конструктор берет переменную l,вместо k и записывает ее в sym ,почему? #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
29.07.2016, 22:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru