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

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

Войти
Регистрация
Восстановить пароль
 
JuiK
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 3
#1

Неизвестная ошибка(скорее всего с размером массива\памяти) - C++

09.03.2013, 02:33. Просмотров 301. Ответов 4
Метки нет (Все метки)

Программа должна решать СЛУ методом Гаусса, не нужно конкретных значений, а просто свести к треугольному виду, и упростить(с фундаментальной системой возиться считаю бредом)

Пример: К-ство неизвестных 2 К-ство строк 4
Вводим значения: 1 1 2 2 3 3 4 4
Получаем ответ:
1 = 1
0 = 0
0 = 0
0 = -inf

Раньше, алгоритм работал, но когда я начал "защищать" программу от нулевых столбцов и нулевых элементов на диагонали появилось это загадочное @-inf@. Всегда в последней строке, после первого элемента,
например:
1 2 3 = 6
0 2 3 = 5
3 -inf -inf = -inf
(числа взяты с головы, главное, показано как ведет себя -inf)
Деления на ноль вроде отсутствует, а потому я решил откинуть предположение с бесконечностью.
Я так понимаю, где то ошибка с размером цикла/массива.
Написано было в Xcode.

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
#include <iostream>
 
using namespace std;
 
int main() {
    
    setlocale(LC_ALL, "Russian");
    cin.precision(2);
    int heigth, length;
    cout << "Введите количество неизвестных: ";
    cin >> length;
    cout << "Введите количество строк: ";
    cin >> heigth;
    
    double **matrix = new double*[heigth]; // Выделение памяти для массива
    for (int i = 0; i < heigth; i++) {
        matrix[i] = new double[length+1];
    }
    
    double **new_matrix = new double*[heigth]; // Выделение памяти для массива
    for (int i = 0; i < heigth; i++) {
        new_matrix[i] = new double[length+1];
    }
    
    for ( int i = 0; i < heigth; i++) {            //заполнение матрицы
        for ( int j = 0; j < (length+1); j++) {
            if (j != (length)) {
                cout << "Введите коефициент " << i+1 << " строки " << j+1 << " столбца ";
                cin >> matrix[i][j];
            }
            else {
                cout << "Введите значение, которому равно " << i+1 << " уравнение ";
                cin >> matrix[i][j];
            }
        }
    }
    
    for (int h = 0; h < heigth; h++) {        //метод Гаусса
        int zero = 0;
        int count = 0;
        int count2 = 0;
        int border = heigth;
        for (int k = 0; k < length+1; k++) {
           while (matrix[h][k] == 0) {                //защита от нулевых столбцов
                zero++;
                if (zero == border) {
                    k++;
                    count2++;
                    break;
                }
                else {for (int g = 0; g < (length+1); g++) {    //смена строки, если на диагонали 0 элемент
                    swap(matrix[k][g], matrix[k+1][g]);
                    }
                }
            }
        
            for (int i = count; i < heigth-1; i++) {            //алгоритм
                for (int j = count2; j < (length+1); j++) {
                    new_matrix[h][j] = (matrix[h][j]/matrix[h][k]);
                    new_matrix[i+1][j] = (matrix[i+1][j] - new_matrix[h][j]*(matrix[i+1][k]/new_matrix[h][k]));
                }
            }
            k++;
            count++;
            count2++;
            border--;
            break;
        }
    }
 
   for ( int i = 0; i < heigth; i++) {     //вывод матрицы на экран
        for ( int j = 0; j < (length+1); j++) {
            if (j != length) {
                cout << new_matrix[i][j] << " ";
            }
            else {
                cout << "= " << new_matrix[i][j];
            }
        }
        cout << endl;
    }
    
    delete [] matrix;
    delete [] new_matrix;
    
    return 0;
}
PS За освобождение памяти не ругать, еще руки не дошли до этого куска кода и было сделано временно для моего удобства.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 02:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неизвестная ошибка(скорее всего с размером массива\памяти) (C++):

Ошибка, скорее всего криво поставил указатели - C++
Вызвано исключение по адресу 0x00007FF6D23A2843 в homework.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x0000000000000000....

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

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб? - C++
Здравствуйте, знатоки! Столкнулся с проблемой выделения памяти под динамические массивы. При создании массива более программа вылетает...

Вставлять тирэ после каждого второго символа строки? В коде скорее всего какое-то переполнение происходит - C++
Помогите поправить Результат должэн быть вот таким jf-js-dl-fs-ld-k Спасибо. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Задача на динамическое программирование(скорее всего) (сколькими способами в сумме получить N, без подряд идущих одинаковых чисел) - C++
Дано число N&lt;106 и три числа A,B,C&lt;=N нужно вывести сколькими способами в сумме получить N, без подряд идущих одинаковых чисел(если N=3,...

Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? - C++
Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? Вот что...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Wolkodav
603 / 456 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
09.03.2013, 02:36 #2
Делите программу на функции(классы) тяжко читать такое.
JuiK
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 3
09.03.2013, 13:45  [ТС] #3
Я заранее прошу прощения за такой код, просто функции плохо знаю, а классы еще вообще не изучал.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
09.03.2013, 13:49 #4
Если не ошибаюсь, то для двумерного массива освобождение памяти нужно делать так:
C++
1
2
3
4
            for(int i=0; i < heigth; ++i)
                delete [] matrix [i];
 
            delete[] matrix ;
JuiK
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 3
09.03.2013, 17:48  [ТС] #5
Afflicted, спасибо, с освобождение памяти проблем не будет, проблема в алгоритме... Не могу понять где ошибся в счетчике.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 17:48
Привет! Вот еще темы с ответами:

Ошибка в цикле for(скорее туплю просто) - C++
Вот часть кода лабораторной работы, в которой создаётся и вводится треугольная матрица: #include &quot;iostream&quot; using namespace std; ...

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

Неизвестная ошибка с++ - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;fstream&gt; #include &lt;math.h&gt; using namespace std; ...

Неизвестная ошибка - C++
При написании кода столкнулся с такой ситуацией. При запуске программы происходит экстренное завершение программы. #include &lt;conio.h&gt; ...


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

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

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