0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
1

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

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

Author24 — интернет-сервис помощи студентам
Вообщем такая беда, решал задачку с одного сайта, решал ее в облаке от 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2016, 18:30
Ответы с готовыми решениями:

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

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

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

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

10
-19 / 1 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:31 2
Код ошибки в студию!
0
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
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
-19 / 1 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:36 4
проблема с массивом, где то индекс не совпадает
0
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
29.07.2016, 18:42  [ТС] 5
Цитата Сообщение от TheBig Посмотреть сообщение
проблема с массивом, где то индекс не совпадает
Проверил все вдоль и поперек, все с индексами хорошо по моему скромному мнению. Тем более с ubuntu никаких проблем не возникает. Не думаю что дело в разных компиляторах: На Ubuntu стоит G++, у меня на Windows 10 стоит MinGW.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 18:42 6
Лучший ответ Сообщение было отмечено IrishSilvan как решение

Решение

Цитата Сообщение от 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
-19 / 1 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:45 7
Цитата Сообщение от IrishSilvan Посмотреть сообщение
Проверил все вдоль и поперек, все с индексами хорошо
не, вот hoggy нашел ошибку
Цитата Сообщение от hoggy Посмотреть сообщение
<--- выход за пределы диапазона
0
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
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
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
29.07.2016, 19:23  [ТС] 10
Огромное спасибо, все исправилось, виной моя элементарная невнимательность. Массивы хотел получить 10х10, а размерность задал 9х9, исправил везде размерность массивов и все заработало, большое спасибо, исправления в циклах не потребовались.
0
-19 / 1 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 22:09 11
да не за что! для нас это пустяковое дело. обращайтесь в любое время, мы на месте
0
29.07.2016, 22:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2016, 22:09
Помогаю со студенческими работами здесь

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

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

Циклы: неожиданное поведение программы (найти и исправить ошибки)
При попытке возобновления программы после использования рандомных чисел программа идет дальше, а не...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru