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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
#1

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

29.07.2011, 11:26. Просмотров 1353. Ответов 31
Метки нет (Все метки)

Вообщем нужно к матрице коэффициентов системы линейных уравнений дописать справа столбец свободных членов. Написал код. На маленьких матрицах работает, а на больших - нет Помогите!
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.
0
Вложения
Тип файла: rar Матрица и столбец.rar (76.6 Кб, 12 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2011, 11:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где косяк в коде? (C++):

Где косяк в коде и как исправить? - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale (LC_CTYPE, &quot;Russian&quot;); cout &lt;&lt; &quot;Введите числа нажимая...

Где косяк? - C++
Имеется задача... #include &lt;stdio.h&gt; #include &lt;string&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; int main() ...

Объясните где я косяк (switch case + char) - C++
Доброе время суток! Имеется: for (unsigned int i=0; i&lt;v.size(); ++i) { cout &lt;&lt;&quot;# &quot;&lt;&lt;v.number &lt;&lt;&quot; \t&quot; ...

Некорректно выводит массив,немогу понять где косяк - C++
#include&lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { setlocale (LC_ALL,&quot;.ACP&quot;); int i,j,n; int...

Где ошибка в коде ? - C++
задача Треугольный ряд чисел : первое число 1 второе на 2 больше чем первое , 3е на 3 больше чем второе итд.......

Где ошибка в коде - C++
по запросу строки программа должна выдавать строку с увеличением на 2 .Например запрашиваю 1 строку он выдает 3 строку { ...

31
LosAngeles
Заблокирован
29.07.2011, 11:32 #2
Цитата Сообщение от hello19 Посмотреть сообщение
double*free = new double[range];
ты бы ещё переменную malloc завёл

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

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

Добавлено через 1 час 50 минут
Есть предложения по поводу изменениния кода????
0
voral
490 / 470 / 79
Регистрация: 16.03.2008
Сообщений: 2,219
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, при этом памяти выделяете только под три элемента, а считываете (по крайней мере если я понял правильно ваш код и задумку) все числа из файла, т.е. вылетаете за пределы выделенной памяти.
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.07.2011, 15:25 #8
Цитата Сообщение от voral Посмотреть сообщение
Я не пробовал, это реально работает?
Работает, но это извращенная форма записи.
Более краткая и понятная(лично мне):
C++
1
while ( fin11 >> free[qwer++]);
оператор >> при невозможности считывания возвращает нулевой указатель. Кстати интересно, что он возвращает при успехе? Немного непонятно...
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
29.07.2011, 15:27 #9
Цитата Сообщение от diagon Посмотреть сообщение
оператор >> при невозможности считывания возвращает нулевой указатель. Кстати интересно, что он возвращает при успехе? Немного непонятно...
Вообще-то он всегда возвращает ссылку на поток.
0
voral
490 / 470 / 79
Регистрация: 16.03.2008
Сообщений: 2,219
29.07.2011, 15:30 #10
И вообще если вы работаете с большим массивом, и я так понимаю в массиве free (блин, коробит писать такое имя массива) должно быть столько элементов сколько строк в обрабатываемом массиве. Если вам нужна работа с большим массивом. То затягивать все это в память - напрасная трата ресурсов:
1 Прочитали одну строку из матрицы
2 Прочитали одно значение из файла 5.txt дописали в конец
3. если не конец матрицы идем на п.1
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.07.2011, 15:30 #11
Хм, где-то видел, что он void* возвращает...
Так ссылка же не может быть нулевой, почему тогда это условие срабатывает?
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
29.07.2011, 15:35 #12
Он не может возвращать void*, так как тогда нельзя было бы написать fin11 >> a >> b >> c
А срабатывает из-за преобразования к bool, видимо.

Добавлено через 2 минуты
То есть не совсем так.
Для потоков определено преобразование к void*, которое и делает возможной запись в условии. Но сам опреатор >> возвращает всё-таки поток, а не указатель
1
diagon
Higher
1930 / 1196 / 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;
}
0
voral
490 / 470 / 79
Регистрация: 16.03.2008
Сообщений: 2,219
29.07.2011, 15:36 #14
http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
29.07.2011, 15:38 #15
Я там добавил немножко.

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
А этот проглатывает?
Проглатывает, потому как преобразование к такому указателю определено в классе.
0
29.07.2011, 15:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2011, 15:38
Привет! Вот еще темы с ответами:

где ошибка в коде - C++
// Урок 9. C++ Игра Угадай число.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Ошибка где-то в коде - C++
Не могу найти ошибку в коде. Выдает: недопустимо , правый оператор имеет тип int. #include &quot;stdafx.h&quot; #include&lt;iostream&gt; using...

Где то в коде ошибка - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #define TRUE 1 #define FALSE 0 #define XRY 8 //Количество вершин графа. typedef int...

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


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

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

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