2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 проблемы с fprintf (вопрос решён)
Сообщение28.01.2009, 19:11 
Аватара пользователя
Код:
#include "stdio.h"
#include "stdlib.h"

main(){
  FILE *res;
  double n[6];
  double a[6];
  double k[6];
  int j;

  a[1]=0.0 ;a[2]=2.5;a[3]=1.0; a[4]=10.0; a[5]=50.0; a[6]= 100.0;
  n[1]= 1.33976; k[1]=4.97186;
  n[2]= 1.35059; k[2]=4.87417;
  n[3]= 1.34497; k[3]=4.91946;
  n[4]= 1.26094; k[4]=4.72988;
  n[5]= 1.44751; k[5]=4.74968;
  n[6]= 5.70861; k[6]=6.61966;

  printf ("%f\n",n[6]);//control

  res = fopen("poiseuille.obs","w+");
  for (j=1; j <7; j++){
    fprintf(res,"%f %f  %f\n",a[j],n[j],k[j]);
  }
  fclose(res);

}
проблема в том, что она (эта "программа") печатает в файл 0.0000 вместо значения n[6]. :cry: Чем это может быть вызвано? Никаких идей.... :oops:

 
 
 
 
Сообщение28.01.2009, 19:27 
Первое замечание: в C нумерация элементов массива (в отличие от Pascal) всегда начинается с нуля, поэтому запись n[6], например, ошибочна: максимум здесь можно задать только n[5]. Аналогично цикл должен пробегать от 0 до 5, а не от 1 до 6.

Второе замечание: когда исправите первое замечание, попробуйте задать формат печати %lf вместо %f.

 
 
 
 
Сообщение28.01.2009, 19:54 
Аватара пользователя
bekas
попробовала, не помогло. И потом, значение k[6] ведь печатает правильно!
В любом случае спасибо.

 
 
 
 
Сообщение28.01.2009, 20:05 
Опубликуйте код после правок - надо посмотреть, что вы исправили.

 
 
 
 
Сообщение28.01.2009, 21:28 
Аватара пользователя
Можно предположить, в чем дело. Смотрите. Вы объявляете:

Код:
  double n[6];
  double a[6];
  double k[6];


При этом в памяти отводится место под 18 объектов типа double, доступ к ним должен осуществляться так: a[0]...a[5], n[0]...n[5] и так далее. Как эти массивы друг относительно друга расположены - может зависеть от компилятора. Когда Вы прописываете значение n[6], то выходите за границу своего массива. Например, если за ним следует массив a, то это повлияет на a[0]. А может повредить другие данные. Это плохая ошибка, за этими вещами нужно внимательно следить.

Добавлено спустя 49 секунд:

А в функции printf попробуйте написать %lg

 
 
 
 
Сообщение28.01.2009, 21:33 
Аватара пользователя
Код:
#include "stdio.h"
#include "stdlib.h"

main(){
  FILE *res;
  double n[5];
  double a[5];
  double k[5];
  int j;

  a[0]=0.0 ;a[1]=2.5;a[2]=1.0; a[3]=10.0; a[4]=50.0; a[5]= 100.0;
  n[0]= 1.33976; k[0]=4.97186;
  n[1]= 1.35059; k[1]=4.87417;
  n[2]= 1.34497; k[2]=4.91946;
  n[3]= 1.26094; k[3]=4.72988;
  n[4]= 1.44751; k[4]=4.74968;
  n[5]= 5.70861; k[5]=6.61966;

  printf ("%f\n",n[5]);//control

  res = fopen("poiseuille.obs","w+");
  for (j=0; j <6; j++){
    fprintf(res,"%f %lf  %lf\n",a[j],n[j],k[j]);
  }
  fclose(res);

}

Теперь врёт не только n[5], но и a[0], и a[5].

 
 
 
 
Сообщение28.01.2009, 21:44 
Аватара пользователя
Естественно, Вы же отвели память под 5 элементов каждого массива, а используете по шесть. Будьте внимательнее.

Добавлено спустя 56 секунд:

И в printf использовать %f точно неправильно. %f - это float, а Вы подаете double. Точно работает %lg

 
 
 
 
Сообщение28.01.2009, 21:53 
Аватара пользователя
PAV
bekas
Всё получилось!!! УРА! Спасибо.
Хотя теперь работает и с %lf, и с %lg.

 
 
 
 
Сообщение29.01.2009, 09:31 
PAV писал(а):
И в printf использовать %f точно неправильно. %f - это float, а Вы подаете double. Точно работает %lg

При вводе f - первая буква от float, а при выводе f - первая буква от fixed (против - e (exponential)).

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group