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

Где косяк в коде? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 11:26     Где косяк в коде? #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
using namespace std;
 
int main()
{
    ifstream fin11("5.txt");
    int range = 3;
    double*free = new double[range];
    int qwer = 0;
    while ( fin11 >> free[qwer])
    { qwer++; }
    fin11.close();
 
    ifstream fin1("4.txt");
    ofstream ofs3("3.txt");
    char a;
    int i = 0;
    while(!fin1.eof())
    {
        a = fin1.get();
        if ( fin1.eof() ) break;
        if ( a == '\n' ){ ofs3 << free[i] << endl;} else
        { ofs3 << a; }
    }
    fin1.close();
    ofs3.close();
delete[] free;
Работаю с матрицей порядка 3638.
Вложения
Тип файла: rar Матрица и столбец.rar (76.6 Кб, 12 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2011, 11:26     Где косяк в коде?
Посмотрите здесь:

где ошибка в коде C++
C++ Где косяк?
C++ Где то в коде ошибка
C++ Некорректно выводит массив,немогу понять где косяк
C++ Где ошибка в коде?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
29.07.2011, 11:32     Где косяк в коде? #2
Цитата Сообщение от hello19 Посмотреть сообщение
double*free = new double[range];
ты бы ещё переменную malloc завёл

Добавлено через 2 минуты
ещё есть у меня подозрение что должно быть так
C++
1
double*free = new double[range*range];
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
29.07.2011, 11:33     Где косяк в коде? #3
Чет до меня не дошло, что этот код делает?
C++
1
2
        while ( fin11 >> free[qwer])
        { qwer++; }
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 11:46  [ТС]     Где косяк в коде? #4
to LosAngeles:
Нее.. так не должно... массив free - для столбца свободных членов. Их ровно range.

to mimicria:
Короче говоря, тут мы просто считываем в массив free элементы из 1-1.txt, пока в нем есть что считывать.
-=ЮрА=-
Заблокирован
Автор FAQ
29.07.2011, 11:53     Где косяк в коде? #5
Цитата Сообщение от hello19 Посмотреть сообщение
double*free = new double[range];
имя переменной вібрано крайне неудачно, лучше заменить любое другое имя, например dfree
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 13:49  [ТС]     Где косяк в коде? #6
Ничего не изменилось...
я не сказал - в качестве результата выдает просто "мусор"
Думаю, это связанно с тем, что вышел за границу free

Добавлено через 1 час 50 минут
Есть предложения по поводу изменениния кода????
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
29.07.2011, 15:24     Где косяк в коде? #7
Вообще не понятно .Чего в этом коде понаписано.
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
using namespace std;   int main() {         ifstream fin11("5.txt");
 // задаем размер исходного массива          int range = 3;
 // выделяем память под одномерный массив из 3 элементов  // типа double
         double*free = new double[range];
// задаем начальное значение индекса
         int qwer = 0;
// читаем из файла в массив, на каждой итерации увеличиваем индекс
// итерации повторять до тех пор пока.....  Я не пробовал, это реально работает?
// может нужно, что то типа eof, fail .....?
         while ( fin11 >> free[qwer])         { qwer++; }         fin11.close();           ifstream fin1("4.txt");         ofstream ofs3("3.txt");         char a;
 
// устанавливаем индекс в 0
         int i = 0;
 
// читаем файл до конца
// но индекс не наращивается т.е. всегда free[0]
// имя массива ужасное
         while(!fin1.eof())         { // следующие две строки и условие цикла навевают мысль, 
// что что то не так организовано 
               a = fin1.get();                 if ( fin1.eof() ) break;
 
// если считанный символ перевод строки то записываем первый элемент массива free 
// и перевод строки иначе считанный символ
                 if ( a == '\n' ){ ofs3 << free[i] << endl;} else                 { ofs3 << a; }         }         fin1.close();         ofs3.close(); delete[] free;
}
Добавлено через 3 минуты
Черт в коде переносы строки пропали, а редактировать не дает

Добавлено через 4 минуты
Т.е. главный вывод:
Вы используете только первый элемент массива free, при этом памяти выделяете только под три элемента, а считываете (по крайней мере если я понял правильно ваш код и задумку) все числа из файла, т.е. вылетаете за пределы выделенной памяти.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.07.2011, 15:25     Где косяк в коде? #8
Цитата Сообщение от voral Посмотреть сообщение
Я не пробовал, это реально работает?
Работает, но это извращенная форма записи.
Более краткая и понятная(лично мне):
C++
1
while ( fin11 >> free[qwer++]);
оператор >> при невозможности считывания возвращает нулевой указатель. Кстати интересно, что он возвращает при успехе? Немного непонятно...
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
29.07.2011, 15:27     Где косяк в коде? #9
Цитата Сообщение от diagon Посмотреть сообщение
оператор >> при невозможности считывания возвращает нулевой указатель. Кстати интересно, что он возвращает при успехе? Немного непонятно...
Вообще-то он всегда возвращает ссылку на поток.
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
29.07.2011, 15:30     Где косяк в коде? #10
И вообще если вы работаете с большим массивом, и я так понимаю в массиве free (блин, коробит писать такое имя массива) должно быть столько элементов сколько строк в обрабатываемом массиве. Если вам нужна работа с большим массивом. То затягивать все это в память - напрасная трата ресурсов:
1 Прочитали одну строку из матрицы
2 Прочитали одно значение из файла 5.txt дописали в конец
3. если не конец матрицы идем на п.1
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.07.2011, 15:30     Где косяк в коде? #11
Хм, где-то видел, что он void* возвращает...
Так ссылка же не может быть нулевой, почему тогда это условие срабатывает?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
29.07.2011, 15:35     Где косяк в коде? #12
Он не может возвращать void*, так как тогда нельзя было бы написать fin11 >> a >> b >> c
А срабатывает из-за преобразования к bool, видимо.

Добавлено через 2 минуты
То есть не совсем так.
Для потоков определено преобразование к void*, которое и делает возможной запись в условии. Но сам опреатор >> возвращает всё-таки поток, а не указатель
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.07.2011, 15:36     Где косяк в коде? #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Он не может возвращать void*
Тогда почему в таком коде
C++
1
2
3
4
5
#include <iostream>
int main(){
    int x;
    int *p = std::cin >> x;
}
gcc пишет
test.cpp:4:23: error: invalid conversion from ‘void*’ to ‘int*’
А этот проглатывает?
C++
1
2
3
4
5
#include <iostream>
int main(){
    int x;
    void *p = std::cin >> x;
}
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
29.07.2011, 15:36     Где косяк в коде? #14
http://www.cplusplus.com/reference/i...perator%3E%3E/
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
29.07.2011, 15:38     Где косяк в коде? #15
Я там добавил немножко.

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
А этот проглатывает?
Проглатывает, потому как преобразование к такому указателю определено в классе.
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
29.07.2011, 15:39     Где косяк в коде? #16
Цитата Сообщение от diagon Посмотреть сообщение
gcc пишет test.cpp:4:23: error: invalid conversion from ‘void*’ to ‘int*’ А этот проглатывает?
C++
1
istream& operator>> (...)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.07.2011, 15:39     Где косяк в коде? #17
Ну тогда вернемся к моему первоначальному вопросу - указатель на что возвращает >> при успешном считывании?
Цитата Сообщение от voral Посмотреть сообщение
istream& operator>> (...)
Т.е. вас не смущает тот факт, что gcc пишет
invalid conversion from ‘void*’ to ‘int*’
а не
invalid conversion from ‘istream&’ to ‘int*’
?
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 15:40  [ТС]     Где косяк в коде? #18
Вот исправил чуток. На маленьких матрицах - работает. Что же касается матрицы порядка 3638, то в качестве присоединенного столбца свободных членов - мусор.
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
    ifstream fin11("5.txt");
    int range = 3;
    double*dfree = new double[range];
    int qwer = 0;
    while ( fin11 >> dfree[qwer] )
    { 
        qwer++; 
    }
    fin11.close();
 
    // Дописывание столбца к матрице
    ifstream fin1("4.txt");
    ofstream ofs3("3.txt");
    char a;
    int i = 0;
    while(!fin1.eof())
    {
        a = fin1.get();
        if ( fin1.eof() ) break;
        if ( a == '\n' ){ ofs3 << dfree[i] << endl; i++; } else
        { ofs3 << a; }
    }
    fin1.close();
    ofs3.close();
 
    delete[] dfree;
В конце каждой строчки матрицы коэффициентов стоит символ переноса строки. Я его использую как сигнал для того, чтобы вставить нужный элемент их столбца свободных членов.
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
29.07.2011, 15:42     Где косяк в коде? #19
Цитата Сообщение от hello19 Посмотреть сообщение
Вот исправил чуток. На маленьких матрицах - работает. Что же касается матрицы порядка 3638, то в качестве присоединенного столбца свободных членов - мусор.
1 Вы внимательно читаете ответы?
2. При использовании матрицы 3639 сколько элементов должен содержать массив dfree?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2011, 15:43     Где косяк в коде?
Еще ссылки по теме:

C++ Где косяк в коде и как исправить?
Где ошибка в коде? C++
C++ Ошибка где-то в коде

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
29.07.2011, 15:43     Где косяк в коде? #20
Цитата Сообщение от diagon Посмотреть сообщение
Ну тогда вернемся к моему первоначальному вопросу - указатель на что возвращает >> при успешном считывании?
Ни на что. Это же нетипизированный указатель и не предполагает ни разыменования, ни даже использования в качестве указателя. Просто использование особенностей языка при преобразовании типов.
Думаю это может быть (void*)(1), хотя это только предположение.
Yandex
Объявления
29.07.2011, 15:43     Где косяк в коде?
Ответ Создать тему
Опции темы

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