Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 23.01.2014
Сообщений: 24
1

Перестал создаваться поток для вывода в файл

20.03.2015, 05:42. Просмотров 389. Ответов 5
Метки нет (Все метки)

Не пойму в чем проблема: была ошибка в расчетах, но вывод работал. пока я ковырялся в void L_spline, а именно менял начальные значения для a и b, и внутреннего цикла, то теперь считается правильно, а выводить в файл не хочет, вернее программа не идет после ofstream. Подскажите плз, как руки из задницы на место прикрутить?
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
 
long double *f,*l;
double *x;
int n;
///=== точное решение ===============================
void exact()
{
    f=new long double[n];//массив точных решений
    for(int i=0;i<n;i++)
        f[i]=exp(x[i]+sin(x[i]));
}///=== интервал интерполяции =======================
void intervals(double a,double h)
{
    x=new double[n];//массив точек
    h=h/10;//шаг
    for(int i=0;i<n;i++,a+=h)
        x[i]=a;
}///=== линейный сплайн =============================
void L_spline()
{
    l=new long double[n];
    long double s;
    l[0]=f[0];//частн случай, вынес из цикла
    for(int b=10,a=0;a<=n;a+=10,b=a+10){//интервал между узловыми точками
        s=(f[a]-f[b])/(x[b]-x[a]);
        for(int i=a+1;i<=b;i++)
            l[i]=f[b]+(x[b]-x[i])*s;
    }
}
///= вывод =
void fileout()
{cout<<"test1\n";
    ofstream ffout("out.txt");cout<<"test2\n";
    ffout<<"x F(x) L2 R\n";
    for(int i=0;i<n;i++)
        ffout<<x[i]<<" "<<f[i]<<" "<<l[i]<<" "<<fabs(f[i]-l[i])<<endl;
    ffout.close();
}
void out()
{
    cout.setf(ios::left);
    cout<<"x      F(x)      L2\n";
    for(int i=0;i<n;i++){
        cout.width(7);  cout.precision(2);  cout<<x[i];
        cout.width(10); cout.precision(4);  cout<<f[i];
        cout.width(10);                     cout<<l[i];
        cout<<endl;
    }
    cout<<endl;
}
 
int main()
{
    int a,h;
    cout<<"a,h\n";
//    cin>>a>>b>>n;
    a=-4;h=1;n=4;
 
    n=(n+1)*10+1;
 
    intervals(a,h);
    exact();
    L_spline();
 
    out();
    fileout();
    cout<<"Finish";
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2015, 05:42
Ответы с готовыми решениями:

Перестал создаваться отчёт
Снова приветствую. Тот код, что представлен ниже, до недавнего времени работал, сейчас перестал...

Поток вывода в html файл
Доброго времени суток. Вот у меня есть задача, просуммировать два многочлена. А результат я хочу...

Как направить поток вывода в файл?
Никак не могу вывести поток в файл, поток направляю, файл создает, а при просмотре командой cat,...

Как перегрузить оператор вывода в поток для вектора?
Стало интересно реализовать подобный функционал, и конечно же ничего не работает. При этом коде:...

5
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
20.03.2015, 18:40 2
no1imits, В вашем коде наблюдаются множественные проблемы и плохие практики. Изначально, проблема из-за которой Ваша программа не работала была в строке:
C++
1
  l[i]=f[b]+(x[b]-x[i])*s;
Индекс i тут достигал значения 60, при том, что память выделялась под массивы длиной 51 элемент.
Фактически происходили некорректные обращения к памяти, не принадлежащей программе.

Я попробовал несколько модифицировать Ваш код, чтобы убрать проблему. Поскольку я не знаком с доменом решаемой проблемы - не могу ручаться за корректность кода с точки зрения решения поставленной задачи, и тем не менее, слегка преобразованный код - большинство имен специально оставлены в старом виде для более легкого восприятия:
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
#include <iostream>
#include <fstream>
#include <cmath>
 
using std::cout;
using std::endl;
using std::ofstream;
using std::ios;
 
long double *Exact(double *x, const int size) {
  long double *f = new long double[size];
  for (int i = 0; i < size; ++i) {
    f[i] = exp(x[i] + sin(x[i]));
  }
  return f;
}
 
double *Intervals(double a, double h, const int size) {
  double *x = new double[size];
  h /= 10;
  for (int i = 0; i < size; ++i) {
    a += h;
    x[i] = a;
  }
  return x;
}
 
long double *LSpline(double *x, long double *f, const int size) {
  long double *l = new long double[size];
  l[0] = f[0];
  for (int a = 0; a < size - 1; a += 10) {
    int b = a + 10;
    long double denominator = x[b] - x[a];
    if (denominator != 0) {
      long double s = (f[a] - f[b]) / denominator;
      for (int i = a; i <= b; ++i) {
        l[i] = f[b] + (x[b] - x[i]) * s;
      }
    }
  }
  return l;
}
 
void Out(long double *l, double *x, long double *f, const int size) {
  cout.setf(ios::left);
  cout << "x      F(x)      L2\n";
  for (int i = 0; i < size; i++) {
    cout.width(7);
    cout.precision(2);
    cout << x[i];
    cout.width(10);
    cout.precision(4);
    cout << f[i];
    cout.width(10);
    cout << l[i];
    cout << endl;
  }
  cout << endl;
}
 
void FileOut(long double *l, double *x, long double *f, const int size) {
  cout << "test1\n";
  ofstream ffout("out.txt");
  cout << "test2\n";
  ffout << "x F(x) L2 R\n";
  for (int i = 0; i < size; i++) {
    ffout << x[i] << " " << f[i] << " " << l[i] << " " << fabs(f[i] - l[i])
          << endl;
  }
  ffout.close();
}
 
int main() {
  std::cout << "a,h\n";
  const int a = -4;
  const int h = 1;
  const int size = 51;
 
  double *x = Intervals(a, h, size);
  long double *f = Exact(x, size);
  long double *l = LSpline(x, f, size);
 
  Out(l, x, f, size);
  FileOut(l, x, f, size);
  delete[] l;
  delete[] x;
  delete[] f;
  cout << "Finish";
}
Пруф работоспособности:
http://ideone.com/fvbCyS

По поводу Вашего кода, более подробно:
1) Код плохо структурирован/форматирован
2) Присутствуют глобальные переменные
3) Память, выделяемая в функциях под массивы не очищается
4) Добавлена директива #include <math.h> на прямую подключающая загловочный файл библиотеки си, вместо #include <cmath> - каноничного в с++ коде
5) using namespace std; - плохая практика
6) ненужные комментарии в коде
7) не выразительные имена функций, названия переменных,
8) множественные действия внутри циклов for
9) закомментированный код
10) использование постфиксного инкремента вместо префиксного
11) использование сырых массивов, выделение памяти через new вместо векторов
12) вызов ostream::close при выходе из скоупа, когда ofstream сам закрывает открытые файлы в при уничтожении
13) отсутствие проверок деления на ноль
1
castaway
20.03.2015, 18:44
  #3

Не по теме:

Цитата Сообщение от no1imits Посмотреть сообщение
Подскажите плз, как руки из задницы на место прикрутить?
Эт тебе проктолог и хирург нужны.:senor:

0
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
20.03.2015, 18:46 4
Подскажите плз, как руки из задницы на место прикрутить?
Советую Вам на досуге заняться прочтением таких книг как:
С. Макконел Совершенный код.
Д. Босуэлл, Т. Фаучер - Читаемый код или программирование как искусство
Мартин Р. - Чистый код
Мартин Фаулер - Рефакторинг.
Стенли Липпман, Жози Лажойе - Язык программирования С++
Прата С. - Язык программирования С++
Страуструп Б. - Язык программирования С++
1
0 / 0 / 0
Регистрация: 23.01.2014
Сообщений: 24
20.03.2015, 19:43  [ТС] 5
На счет рукожопости понял, но не понятно почему программа не крашилась, при i выходящем за пределы массива, а только не создавала поток после?
0
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
20.03.2015, 19:48 6
no1imits, потому-что обращение к элементу массива, по невалидному индексу приводит к неопределенному поведению, оно может вести себя именно так, как Вы хотели, а может удалять Вам все на жестком диске, запускать ядерные боеголовки и изобретать лекарство от рака одновременно.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2015, 19:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Перегрузить операторы ввода/вывода в поток (>>, <<) для класса
Помогите, перегрузить операции ввода/вывода в поток (&gt;&gt;, &lt;&lt;) для класса A. Для объекта класса A...

Реализовать перегрузку операторов << и >> для вывода вектора в поток
Дана программа: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iostream&gt; using namespace...

Почему не хочет создаваться файл?
Если в тексте программы указать путь и имя файла, то файл создаваться не хочет, char...

Разработать шаблон класса для вывода вектора данных в поток
Разработать шаблон соответствующего класса, где поля могут иметь различные типы данных....


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

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

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