Добрый день, у меня есть программа которая считывает данные при нажатий кнопки(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) Решение, чтобы работало и выводила в эдиты нужные величины.