Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2022, 13:01   #1
asa52
 
Регистрация: 09.12.2022
Сообщений: 6
По умолчанию Borland Builder 6 c++ Ошибка в коде

Добрый день, у меня есть программа которая считывает данные при нажатий кнопки(1) Решение и выдает в едиты 1-5 некие величины. В программе используется другая программа для апроксимаций(она же есть в архиве).

Код программы:
Код:
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Close();        
}
//---------------------------------------------------------------------------
 
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int j;
 FILE*fp;
   if (InputOpen->Execute()) {
      if(!(fp == fopen(InputOpen->FileName.c_str(),"rt")))
         {Application->MessageBoxA("Файл не открылся", "Ошибка", MB_OK);}
      else
         {int ii=fscanf(fp," m= %d "
           " ro= %le atom= %le "
           " l1= %le "
           " R= %le "
           " Q= %le U= %le kcur= %le kenergy= %le "
           " Ysput= %le Yself_sput= %le Mion= %le "
           " Esput= %le Eself_sput= %le "
           " S= %8s "
 
           ,&m,&ro,&atom,&l1,&R,&Q,&U,&kcur,&kenergy,&Ysput,&Yself_sput,&Mion,&Esput,&Eself_sput,S);
          if (ii!=15) Application->MessageBoxA("Не все данные введены",
                 "Ошибка", MB_OK);
       fclose(fp);
       }
   }
   // Мощность, усреднённая по периоду (Вт)
   Edit1->Text=AnsiString(FormatFloat("0.000E+00",Q));
   Edit3->Text=AnsiString(FormatFloat("0.000E+00",U));
   Edit4->Text=AnsiString(FormatFloat("0.000E+00",Ysput));
   Edit5->Text=AnsiString(FormatFloat("0.000E+00",Yself_sput));
 
   //Перевод средней энергии расп. частиц из эВ/атом в Дж/атом
   Esput=Esput*electron;
   Eself_sput=Eself_sput*electron;
 
   r.resize(m);  /* координаты ячеек вдоль поверхности мишени */
   q.resize(m); /* плотность мощности */
   vsput.resize(m); /* скорость распыления при бомбардировке ионов рабочего газа */
 
     //разделение подложки на м участков
 
// Ввод данных пространственного распределения плотности мощности вдоль поверхности мишени
   for (j=0; j<m; j++)
   {
   //Расчет апроксимирующей мощности, Вт
   double P_approx=0.0;
   hr=R/m;
   r[j] = hr/2+hr*j;
   P_approx=(P_approx+r[j]*q[j])*hr*2.0*pi;
   Edit2->Text=AnsiString(FormatFloat("0.00E+00",P_approx));
 
 
   hr=R/m;
   r[j] = hr/2+hr*j;
   vec FR, FF;
   AnsiString S_help;
   S_help = AnsiString(S)+".txt";
   ifstream input(S_help.c_str());
   double value;
   input >> value;
   while (!input.eof())
   {
      FR.push_back(value);
      input >> value;
      FF.push_back(value);
      input >> value;
   }
   nist = FF.size();
 
 
   // неравномерное распределение плотности мощности вдоль мишени
   vec f;
   f.resize(m);
   f[j]=approxd(r[j],nist,FR.begin(),FF.begin());
   double B=0;
   B=B+r[j]*f[j]*hr;
   double A=Q/(2.0*pi*B);
   for (j=0; j<m; j++)
   q[j]=f[j]*A;
   }
// for (j=0; j<m; j++) /* равномерное распределение плотности мощности вдоль поверхности мишени */
//     q[j]=Q/(pi*R*R);
 
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 
no=ro*NAvogadro/atom;   /* ядерная плотность */
 
 
FILE* file = fopen("data.txt", "wt");
  if (file == NULL) {
    Application->MessageBoxA("Файл не создан", "Ок", MB_OK);
    return;
  }
 
for (int j = 0; j < m; j++)
{
    vsput[j]=(q[j]/(U*electron))*kcur*kenergy*Ysput/(ro*NAvogadro/atom);
    r[j]=hr/2+hr*j;
    fprintf(file, "%.3E %.3E\n", r[j], vsput[j]);
}
  fclose(file);        
}
//---------------------------------------------------------------------------

а в файле header:

Код:
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <stdio.h>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
#include <vector>
#include <algorithm>
#include <iostreams>
#include <fstream>
#include <math.h>
#include "math2.h"
#include "Math.hpp"
#include "math2.cpp"
 
 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TPanel *Panel1;
        TButton *Button1;
        TButton *Button2;
        TButton *Button3;
        TPanel *Panel2;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label8;
        TLabel *Label46;
        TLabel *Label5;
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TEdit *Edit4;
        TEdit *Edit5;
        TOpenDialog *InputOpen;
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
 
double i, m, nist, nist2;
double ro, atom, Mion, l1, Ysput, no, kenergy, Yself_sput, Esput, Eself_sput, RR,angle,ang, Vdepsput, Vsub;
double R, hr, X0, Y0, L;
double Q, U; /* уср. мощность и напряжение разряда */
double kcur; /* доли ионного тока в токе разряда и энергии ионов в напряжении разряда */
double NAvogadro, pi, electron;
char S[9];    /* для файла с распределением плотности тока вдоль поверхности мишени */
 
 
 
 
typedef vector <double> vec;
vec r, q, vsput, vsput_return;
 
        __fastcall TForm1(TComponent* Owner);
        // для скорости осаждения
        double __fastcall f_int(double, double, double, double);
        double __fastcall Vdepsput_uneven(double, double);
        double __fastcall Vdepsput_uneven_return(double, double);
        //approxd(double, int, double, double);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Файл запускается, но при нажатий кнопки Расчет происходит сначала действие на снимке1 , а потом при нажатий кнопки ОК как на снимке2. У меня есть предположение что проблема с вот этим участком:


Код:
//Расчет апроксимирующей мощности, Вт
   double P_approx=0.0;
   hr=R/m;
   r[j] = hr/2+hr*j;
   P_approx=(P_approx+r[j]*q[j])*hr*2.0*pi;
   Edit2->Text=AnsiString(FormatFloat("0.00E+00",P_approx));
т.к. при выводе в эдит два там ничего не показывается.
Исходный файл для компиляций загрузил во вложения


Буду благодарен если поможете нормальной работе функций кнопке(1) Решение, чтобы работало и выводила в эдиты нужные величины.
Изображения
Тип файла: jpg Снимок.JPG (33.5 Кб, 13 просмотров)
Тип файла: jpg Снимок2.JPG (30.8 Кб, 13 просмотров)
Вложения
Тип файла: rar NULE.rar (472.5 Кб, 0 просмотров)
Тип файла: txt Ar_Cr_1200W_2021_для Cr.txt (164 байт, 0 просмотров)
asa52 вне форума Ответить с цитированием
Старый 27.12.2022, 14:29   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от asa52 Посмотреть сообщение
Код:
if(!(fp == fopen(InputOpen->FileName.c_str(),"rt")))
         {Application->MessageBoxA("Файл не открылся", "Ошибка", MB_OK);}
У вас срабатывает вот этот код, но вы не завершаете вычисления после этого. При этом в переменных не установлены никакие значения, которые должны были быть получены из файла.

Что за файл указан в InputOpen->FileName.c_str()? Он существует?
macomics вне форума Ответить с цитированием
Старый 27.12.2022, 15:05   #3
asa52
 
Регистрация: 09.12.2022
Сообщений: 6
По умолчанию

Доброго времени суток, считываю файл во вложений, там по сути значения этих перменных которые дальше идут на расчет

Что в документе:
Код:
m=20
ro=7.2e3 atom=52e-3
l1=6.556e-19
R=40e-3
Q=1200 U=800  kcur=0.9 kenergy=0.75
Ysput=1.88 Yself_sput=1.4 Mion=40e-3
Esput=21.78 Eself_sput=14.72
S=Bxnew
При нажатий на кнопку как раз происходит выбор файла

Самое удивительное что если убрать вот здесь один знак равно:
Код:
if(!(fp = fopen(InputOpen->FileName.c_str(),"rt")))
         {Application->MessageBoxA("Файл не открылся", "Ошибка", MB_OK);}
, то все здесь работает и выходит только предупреждение( не знаю как это работает), но в дальнейшем выдает Error: Floating Point Overflow на строке:

Код:
r[j] = hr/2+hr*j;
(это с кнопки один, да-да я заметил что я одно и тоже написал два раза, но если убрать один раз то все равно остается такая ошибка).
Вложения
Тип файла: txt Ar_Cr_1200W_2021_для Cr.txt (164 байт, 0 просмотров)
asa52 вне форума Ответить с цитированием
Старый 27.12.2022, 16:04   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Цитата:
Самое удивительное что если убрать вот здесь один знак равно:
Но по логике тут и должен быть один знак равенства. Это операция присвоения, а не сравнения.
Переменная fp, по сути, указатель на буфер, выделенный ОС для файлового обмена вашего приложения.

PS: Я не дока в С-ях, и могу ошибаться. Пусть поправят.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Builder Ошибка в коде кодирования методом Фано. WolfEater Помощь студентам 5 19.03.2015 14:23
учу borland С++ builder 6 Dazzl C++ Builder 3 13.05.2011 18:01
Ошибка Borland C++ Builder 6.0 balalay12 C++ Builder 4 22.09.2010 09:50
c++ Borland builder 4ika C++ Builder 1 27.11.2009 20:32
Знакомлюсь с Borland C++ Builder 6. Ошибка при компилировании. mflat C++ Builder 8 20.02.2009 15:28