2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 проблемы с fprintf (вопрос решён)
Сообщение28.01.2009, 19:11 
Аватара пользователя


19/03/07
597
Bielefeld
Код:
#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 


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

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

 Профиль  
                  
 
 
Сообщение28.01.2009, 19:54 
Аватара пользователя


19/03/07
597
Bielefeld
bekas
попробовала, не помогло. И потом, значение k[6] ведь печатает правильно!
В любом случае спасибо.

 Профиль  
                  
 
 
Сообщение28.01.2009, 20:05 


27/11/05
183
Северодонецк
Опубликуйте код после правок - надо посмотреть, что вы исправили.

 Профиль  
                  
 
 
Сообщение28.01.2009, 21:28 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Можно предположить, в чем дело. Смотрите. Вы объявляете:

Код:
  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 
Аватара пользователя


19/03/07
597
Bielefeld
Код:
#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 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Естественно, Вы же отвели память под 5 элементов каждого массива, а используете по шесть. Будьте внимательнее.

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

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

 Профиль  
                  
 
 
Сообщение28.01.2009, 21:53 
Аватара пользователя


19/03/07
597
Bielefeld
PAV
bekas
Всё получилось!!! УРА! Спасибо.
Хотя теперь работает и с %lf, и с %lg.

 Профиль  
                  
 
 
Сообщение29.01.2009, 09:31 


20/04/07
14
PAV писал(а):
И в printf использовать %f точно неправильно. %f - это float, а Вы подаете double. Точно работает %lg

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group