class 的成员在创建新实例时被覆盖 c++/cli
members of class being overwritten when new instance created c++/cli
我已尝试执行以下操作:
1) 创建一个包含托管数组的 class
2) 创建这个 class 的三个实例
3) 从三个不同的数据文件中填充这些数组。
4) 对该数据进行分析
我已经能够编译执行任务一和二的代码,但是当我填充后续实例的数组时,它们似乎会覆盖之前的数据。我尝试使用结构而不是 class。我曾尝试使用本机数组而不是托管数组。我显然在这里遗漏了一些东西,但我无法在我看过的任何地方找到我的答案。也许我不知道正确问我的问题的术语。
此外,当我使用调试器时,我发现垃圾收集器似乎在我对数据执行分析之前删除了我的数据。
如有任何帮助,我们将不胜感激。
问题是当按下加载第二个文件的按钮时,class 实例 LowE 被 MedE 覆盖。
我试图在没有发布整个项目代码的情况下提出这个问题,但没有成功所以,这就是我所拥有的:
文件runData.h
#pragma once
#define MAXPOINTS 1536
#define LDBL_MAX 1.7976931348623158e+308
#define MAXORDER 10
#define MAXVOLUME 100.0
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Diagnostics;
namespace EDCCalApp02 {
public ref class runData //: public System::ComponentModel::Component
{
public:
static array<double^> ^WPcoefs = gcnew array<double^>(MAXORDER+1);
static array<double ^,2> ^fData1 = gcnew array<double^,2>(MAXPOINTS,7);
static array<int^,2> ^iData1 = gcnew array<int^,2>(MAXPOINTS,7);
static array<int^,2> ^DataSize = gcnew array<int^,2>(3,3);
int numLines;
int numCols;
int indx;
int drops;
runData(void)
{
for (int n = 0; n<1536; n++) {
fData1[n,0] = 0.0;
iData1[n,5] = 0;
iData1[n,6] = 0;
}
}
private:
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
components = gcnew System::ComponentModel::Container();
}
#pragma endregion
};
}
文件Form1.h
#pragma once
#define MAXPOINTS 1536
#define LDBL_MAX 1.7976931348623158e+308
#define MAXORDER 10
#define MAXVOLUME 100.0
#include "runData.h"
#include "Graph1.h"
#include "Global1.h"
namespace EDCCalApp02 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;
array<double^> ^polyfit(array<double^,2> ^, int, int);
array<double^,2> ^datasort(array<double^,2> ^, int);
double ldpow( double , unsigned );
float poly_correlcoef( array<double^,2> ^ ,int, array<double^> ^, int );
array<double^> ^get_xy_max_min( array<double^,2> ^ ,int );
array<double^,2> ^fillData(int, array<double^> ^, runData ^ );
array<double^,2> ^makeCurve(array<double^,2> ^, array<double^,2> ^, array<double^,2> ^, double);
array<double^,2> ^makeCoefs(array<double^,2> ^, array<double^> ^);
runData ^LoadData(array<String^> ^);
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
int numLines = 0, numCols=0;
try{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader("WellPlate Volume Definitions.txt");
array<String^> ^lines= System::IO::File::ReadAllLines("WellPlate Volume Definitions.txt");
numLines = lines->Length;
array<String^> ^Header=lines[0]->Split(',');
numCols = Header->Length;
staVolFile = gcnew array<String^,2>(numLines,numCols);
for(int i=1;i<numLines;i++) {
array<String^> ^lineSplit=lines[i]->Split(',');
for(int j=0;j<numCols;j++){
staVolFile[i-1,j] = lineSplit[j];
}
cbx_WellPlateList->Items->Add(staVolFile[i-1,0]);
}
sr->Close();
}
catch(IOException ^) {
MessageBox::Show(L"WellPlate Volume Definitions.txt\n\n"
L"Was Not Read\n\n"
L"Please Check the File\n"
L"and Try Again");
}
}
protected:
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::TextBox^ tbx_File1;
protected:
protected:
private: System::Windows::Forms::Label^ lbl_File1;
private: System::Windows::Forms::ComboBox^ cbx_WellPlateList;
private: System::Windows::Forms::TextBox^ tbx_File2;
private: System::Windows::Forms::TextBox^ tbx_File3;
private: System::Windows::Forms::Label^ lbl_Volume;
private: System::Windows::Forms::Button^ btn_Exit;
private:
public:
array<String^,2> ^staVolFile;
static array<bool^> ^loaded = gcnew array<bool^>(4) {false,false,false,false};
static runData ^LowE = ( gcnew runData);
static runData ^MedE = ( gcnew runData);
static runData ^HighE = (gcnew runData);
private: System::Windows::Forms::OpenFileDialog^ openFileDialog1;
private: System::Windows::Forms::SaveFileDialog^ saveFileDialog1;
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
this->tbx_File1 = (gcnew System::Windows::Forms::TextBox());
this->lbl_File1 = (gcnew System::Windows::Forms::Label());
this->cbx_WellPlateList = (gcnew System::Windows::Forms::ComboBox());
this->btn_Exit = (gcnew System::Windows::Forms::Button());
this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());
this->saveFileDialog1 = (gcnew System::Windows::Forms::SaveFileDialog());
this->SuspendLayout();
//
// tbx_File1
//
this->tbx_File1->Location = System::Drawing::Point(40, 100);
this->tbx_File1->Name = L"tbx_File1";
this->tbx_File1->Size = System::Drawing::Size(267, 20);
this->tbx_File1->TabIndex = 0;
this->tbx_File1->Text = L"Enter .csv File 1";
// cbx_WellPlateList
//
this->cbx_WellPlateList->FormattingEnabled = true;
this->cbx_WellPlateList->Location = System::Drawing::Point(40, 40);
this->cbx_WellPlateList->Name = L"cbx_WellPlateList";
this->cbx_WellPlateList->Size = System::Drawing::Size(221, 21);
this->cbx_WellPlateList->TabIndex = 2;
this->cbx_WellPlateList->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::cbx_WellPlateList_SelectedIndexChanged);
this->btnFile1->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink;
this->btnFile1->Location = System::Drawing::Point(306, 98);
this->btnFile1->Name = L"btnFile1";
this->btnFile1->Size = System::Drawing::Size(25, 24);
this->btnFile1->TabIndex = 7;
this->btnFile1->UseVisualStyleBackColor = true;
this->btnFile1->Click += gcnew System::EventHandler(this, &Form1::btnFile1_Click);
// lbl_WellplateList
//
this->lbl_WellplateList->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom)
| System::Windows::Forms::AnchorStyles::Left)
| System::Windows::Forms::AnchorStyles::Right));
this->lbl_WellplateList->AutoSize = true;
this->lbl_WellplateList->Location = System::Drawing::Point(45, 25);
this->lbl_WellplateList->Name = L"lbl_WellplateList";
this->lbl_WellplateList->Size = System::Drawing::Size(98, 13);
this->lbl_WellplateList->TabIndex = 28;
this->lbl_WellplateList->Text = L"Wellplate Selection";
//
// btn_Graph1
//
this->btn_Graph1->BackColor = System::Drawing::Color::White;
this->btn_Graph1->Location = System::Drawing::Point(348, 99);
this->btn_Graph1->Name = L"btn_Graph1";
this->btn_Graph1->Size = System::Drawing::Size(38, 23);
this->btn_Graph1->TabIndex = 29;
this->btn_Graph1->Text = L"G1";
this->btn_Graph1->UseVisualStyleBackColor = true;
this->btn_Graph1->Click += gcnew System::EventHandler(this, &Form1::btn_Graph1_Click);
//
// btn_Create
//
this->btn_Create->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
this->btn_Create->Location = System::Drawing::Point(40, 292);
this->btn_Create->Name = L"btn_Create";
this->btn_Create->Size = System::Drawing::Size(75, 23);
this->btn_Create->TabIndex = 33;
this->btn_Create->Text = L"Create Cal";
this->btn_Create->UseVisualStyleBackColor = true;
this->btn_Create->Click += gcnew System::EventHandler(this, &Form1::btn_Create_Click);
this->btn_Exit->Anchor = System::Windows::Forms::AnchorStyles::Bottom;
this->btn_Exit->Location = System::Drawing::Point(657, 304);
this->btn_Exit->Name = L"btn_Exit";
this->btn_Exit->Size = System::Drawing::Size(75, 23);
this->btn_Exit->TabIndex = 36;
this->btn_Exit->Text = L"Exit";
this->btn_Exit->UseVisualStyleBackColor = true;
this->btn_Exit->Click += gcnew System::EventHandler(this, &Form1::btn_Exit_Click);
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->BackColor = System::Drawing::Color::White;
this->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"$this.BackgroundImage")));
this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;
this->ClientSize = System::Drawing::Size(830, 348);
this->Controls->Add(this->btn_Exit);
this->Controls->Add(this->btn_Graph1);
this->Controls->Add(this->lbl_WellplateList);
this->Controls->Add(this->lbl_Order1);
this->Controls->Add(this->lbl_Max1);
this->Controls->Add(this->lbl_Min1);
this->Controls->Add(this->tbx_Order1);
this->Controls->Add(this->cbx_WellPlateList);
this->Controls->Add(this->lbl_File1);
this->Controls->Add(this->tbx_File1);
this->Icon = (cli::safe_cast<System::Drawing::Icon^ >(resources->GetObject(L"$this.Icon")));
this->Name = L"Form1";
this->Text = L"EDC Calibration App";
this->ResumeLayout(false);
this->PerformLayout();
}
编译指示结束区域
私有:System::Void cbx_WellPlateList_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
double WPcoefs[MAXORDER+1];// = gcnew array<double^>(MAXORDER+1);
int selectedIndex = cbx_WellPlateList->SelectedIndex;
for(int i=0; i <= MAXORDER; i++) WPcoefs[i]=0.0;
for(int i=3;i<8;i++){
WPcoefs[i-3] = double::Parse(staVolFile[selectedIndex,i]);
}
for(int i=0;i<MAXORDER+1;i++){
LowE->WPcoefs[i] = WPcoefs[i];
MedE->WPcoefs[i] = WPcoefs[i];
HighE->WPcoefs[i] = WPcoefs[i];
}
loaded[0] = true;
}
private: System::Void btnFile1_Click(System::Object^ sender, System::EventArgs^ e) {
if(!*loaded[0]) {
MessageBox::Show("Please select a plate and try again.");
return;
}
try {
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader(openFileDialog1->FileName);
如果 (!sr)
{
tbx_File1->文字 = "Could not open file.";
}
String^ FilePath = openFileDialog1->FileName;
array<String^> ^File = FilePath->Split('\');
int num = File->Length;
tbx_File1->Text = File[num-1];
array<String^> ^rawData1= System::IO::File::ReadAllLines(openFileDialog1->FileName);
LowE = LoadData(rawData1);
loaded[1] = true;
sr->Close();
}
}
catch(IOException ^)
{
MessageBox::Show("File Not Read\n Please Check the File\n and Try Again");
return;
}
}
私有:System::Void btnFile2_Click(System::Object^ sender, System::EventArgs^ e) {
if(!*loaded[0]) {
MessageBox::Show("Please select a plate and try again.");
return;
}
try {
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader(openFileDialog1->FileName);
如果 (!sr)
{
tbx_File2->正文 = "Could not open file.";
}
String^ FilePath = openFileDialog1->FileName;
array<String^> ^File = FilePath->Split('\');
int num = File->Length;
tbx_File2->Text = File[num-1];
array<String^> ^rawData2= System::IO::File::ReadAllLines(openFileDialog1->FileName);
MedE = LoadData(rawData2);
loaded[2] = true;
sr->Close();
}
}
catch(IOException ^)
{
MessageBox::Show("File Not Read\n Please Check the File\n and Try Again");
return;
}
}
私有:System::Void btnFile3_Click(System::Object^ sender, System::EventArgs^ e) {
if(!*loaded[0]) {
MessageBox::Show("Please select a plate and try again.");
return;
}
try {
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader(openFileDialog1->FileName);
如果 (!sr)
{
tbx_File3->文字 = "Could not open file.";
}
String^ FilePath = openFileDialog1->FileName;
array<String^> ^File = FilePath->Split('\');
int num = File->Length;
tbx_File3->Text = File[num-1];
array<String^> ^rawData3= System::IO::File::ReadAllLines(openFileDialog1->FileName);
HighE = LoadData(rawData3);
loaded[3] = true;
sr->Close();
}
}
catch(IOException ^)
{
MessageBox::Show("File Not Read\n Please Check the File\n and Try Again");
return;
}
}
私有:System::Void btn_Exit_Click(System::Object^ sender, System::EventArgs^ e) {
this->Close();
}
私有:System::Void btn_Graph1_Click(System::Object^ sender, System::EventArgs^ e) {
int Size = LowE->indx;
if(Size > 3){
array<double^,2> ^plotData = gcnew array<double^,2>(Size,4);
array<double^,2> ^fitData = gcnew array<double^,2>(Size,2);
double Min = Convert::ToDouble(tbx_Min1->Text);
double Max = Convert::ToDouble(tbx_Max1->Text);
int Ord = Convert::ToInt32(tbx_Order1->Text);
double Vol;
int count = 0;
int iData;
for(int i=1; i < Size-1 ; i++){
if((*LowE->fData1[i,0] <= Max) && (*LowE->fData1[i,0] >= Min )){
Vol = ((*LowE->fData1[i,6] / *LowE->iData1[i,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
plotData[count,0] = *LowE->fData1[i,0];
fitData[count,0] = *plotData[count,0];
iData = (int) (100.0 * *plotData[count,0]);
plotData[count,0] = iData / 100.0;
plotData[count,1] = Vol;
fitData[count,1] = Vol;
count++;
}
}
}
array<double^> ^plotCoefs = gcnew array<double^>(MAXORDER +1);
plotCoefs = polyfit(fitData,count-1,Ord);
double Delta = (Max + 0.2)/count;
plotData[0,2] = 0.0;
for(int i=0; i < count; i++) {
double LLOrd = 1.0;
plotData[i,3] = 0.0;
if(i>0) plotData[i,2] = *plotData[i-1,2] + Delta;
for(int k=0; k <= Ord; k++) {
plotData[i,3] = *plotData[i,3] +*plotCoefs[k] * LLOrd;
LLOrd = LLOrd * *plotData[i,2];
}
}
if(count > 2){
Graph1^ plot1 = gcnew Graph1(count-1,plotData);
plot1->ShowDialog();
} else{
MessageBox::Show(" Not Enough Valid Data\n Please Check the File\n and Try Again");
}
} else{
MessageBox::Show(" File Does Not Contain Enough Data\n Please Check the File\n and Try Again");
}
}
私有:System::Void btn_Graph2_Click(System::Object^ sender, System::EventArgs^ e) {
int Size = MedE->indx;
if(Size > 3){
array<double^,2> ^plotData = gcnew array<double^,2>(Size,4);
array<double^,2> ^fitData = gcnew array<double^,2>(Size,2);
double Min = Convert::ToDouble(tbx_Min2->Text);
double Max = Convert::ToDouble(tbx_Max2->Text);
int Ord = Convert::ToInt32(tbx_Order2->Text);
double Vol;
int count = 0;
int iData;
for(int i=1; i < Size-1 ; i++){
if((*MedE->fData1[i,0] <= Max) && (*MedE->fData1[i,0] >= Min )){
Vol = ((*MedE->fData1[i,6] / *MedE->iData1[i,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
plotData[count,0] = *MedE->fData1[i,0];
fitData[count,0] = *plotData[count,0];
iData = (int) (100.0 * *plotData[count,0]);
plotData[count,0] = iData / 100.0;
plotData[count,1] = Vol;
fitData[count,1] = Vol;
count++;
}
}
}
array<double^> ^plotCoefs = gcnew array<double^>(MAXORDER +1);
plotCoefs = polyfit(fitData,count-1,Ord);
double Delta = (Max + 0.2)/count;
plotData[0,2] = 0.0;
for(int i=0; i < count; i++) {
double LLOrd = 1.0;
plotData[i,3] = 0.0;
if(i>0) plotData[i,2] = *plotData[i-1,2] + Delta;
for(int k=0; k <= Ord; k++) {
plotData[i,3] = *plotData[i,3] +*plotCoefs[k] * LLOrd;
LLOrd = LLOrd * *plotData[i,2];
}
}
if(count > 2){
Graph1^ plot1 = gcnew Graph1(count-1,plotData);
plot1->ShowDialog();
} else{
MessageBox::Show(" Not Enough Valid Data\n Please Check the File\n and Try Again");
}
} else{
MessageBox::Show(" File Does Not Contain Enough Data\n Please Check the File\n and Try Again");
}
}
私有:System::Void btn_Graph3_Click(System::Object^ sender, System::EventArgs^ e) {
int Size = HighE->indx;
if(Size > 3){
array<double^,2> ^plotData = gcnew array<double^,2>(Size,4);
array<double^,2> ^fitData = gcnew array<double^,2>(Size,2);
double Min = Convert::ToDouble(tbx_Min3->Text);
double Max = Convert::ToDouble(tbx_Max3->Text);
int Ord = Convert::ToInt32(tbx_Order3->Text);
double Vol;
int count = 0;
int iData;
for(int i=1; i < Size-1 ; i++){
if((*HighE->fData1[i,0] <= Max) && (*HighE->fData1[i,0] >= Min )){
Vol = ((*HighE->fData1[i,6] / *HighE->iData1[i,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
plotData[count,0] = *HighE->fData1[i,0];
fitData[count,0] = *plotData[count,0];
iData = (int) (100.0 * *plotData[count,0]);
plotData[count,0] = iData / 100.0;
plotData[count,1] = Vol;
fitData[count,1] = Vol;
count++;
}
}
}
array<double^> ^plotCoefs = gcnew array<double^>(MAXORDER +1);
plotCoefs = polyfit(fitData,count-1,Ord);
double Delta = (Max + 0.2)/count;
plotData[0,2] = 0.0;
for(int i=0; i < count; i++) {
double LLOrd = 1.0;
plotData[i,3] = 0.0;
if(i>0) plotData[i,2] = *plotData[i-1,2] + Delta;
for(int k=0; k <= Ord; k++) {
plotData[i,3] = *plotData[i,3] +*plotCoefs[k] * LLOrd;
LLOrd = LLOrd * *plotData[i,2];
}
}
if(count > 2){
Graph1^ plot1 = gcnew Graph1(count-1,plotData);
plot1->ShowDialog();
} else{
MessageBox::Show(" Not Enough Valid Data\n Please Check the File\n and Try Again");
}
} else{
MessageBox::Show(" File Does Not Contain Enough Data\n Please Check the File\n and Try Again");
}
}
私有:System::Void btn_Create_Click(System::Object^ sender, System::EventArgs^ e) {
int i=0;
array<double^> ^Args1 = gcnew array<double^>(6) {0.0,0.0,2.0,5.0,3.0,3.0};
array<double^> ^Args2 = gcnew array<double^>(6) {0.0,0.0,2.0,5.0,3.0,3.0};
array<double^> ^Args3 = gcnew array<double^>(6) {0.0,0.0,2.0,5.0,3.0,3.0};
array<double^,2> ^Coefs1 = gcnew array<double^,2>(MAXORDER +4, 4);
array<double^,2> ^Coefs2 = gcnew array<double^,2>(MAXORDER +4, 4);
array<double^,2> ^Coefs3 = gcnew array<double^,2>(MAXORDER +4, 4);
array<double^,2> ^Curve = gcnew array<double^,2>(36, 4);
int minSz = LowE->indx;
int midSz = MedE->indx;
int maxSz = HighE->indx;
double Vol = (Convert::ToDouble(tbx_Volume->Text));
array<double^,2> ^minData, ^medData, ^maxData;
Args1[0] = (Convert::ToDouble(tbx_Min1->Text));
Args1[1] = (Convert::ToDouble(tbx_Max1->Text));
Args1[2] = (Convert::ToDouble(tbx_Order1->Text));
minData = fillData(minSz, Args1, LowE);
Coefs1 = makeCoefs(minData,Args1);
Args2[0] = (Convert::ToDouble(tbx_Min2->Text));
Args2[1] = (Convert::ToDouble(tbx_Max2->Text));
Args2[2] = (Convert::ToDouble(tbx_Order2->Text));
medData = fillData(minSz, Args2, MedE);
Coefs2 = makeCoefs(medData,Args1);
Args3[0] = (Convert::ToDouble(tbx_Min3->Text));
Args3[1] = (Convert::ToDouble(tbx_Max3->Text));
Args3[2] = (Convert::ToDouble(tbx_Order3->Text));
maxData = fillData(minSz, Args3, HighE);
Coefs3 = makeCoefs(maxData,Args1);
Curve = makeCurve(Coefs1,Coefs2,Coefs3,Vol);
array<String^,2> ^calFile = gcnew array<String^,2>(36,4);
double tempDouble;
String ^myfile = "";
saveFileDialog1->ShowDialog() ;
myfile = saveFileDialog1->FileName;
try {
FileStream ^outFile = gcnew FileStream(myfile, FileMode::Create, FileAccess::Write);
StreamWriter ^streamOut = gcnew StreamWriter(outFile);
for(i=0; i<36; i++){
tempDouble = *Curve[i,0];
calFile[i,0] = tempDouble.ToString("F2");
tempDouble = *Curve[i,1];
calFile[i,1] = tempDouble.ToString("F0");
tempDouble = *Curve[i,2];
calFile[i,2] = tempDouble.ToString("F2");
tempDouble = *Curve[i,3];
calFile[i,3] = tempDouble.ToString("F2");
streamOut->WriteLine( "{0}\t{1}\t{2}\t{3}\t{1}\t{1}\t{1}\t{1}\t{1}\t{1}\t{1}\t{1}",calFile[i,0], calFile[i,1], calFile[i,2],calFile[i,3] );
}
streamOut->Close();
}
catch(IOException ^)
{
MessageBox::Show("File Not Written\n Please Check the File\n and Try Again");
}
}
};
array<double^,2> ^makeCurve(array<double^,2> ^Coef1, array<double^,2> ^Coef2, array<double^,2> ^Coef3, double Vol) {
array<double^,2> ^Curve = gcnew array<double^,2>(36, 4);
array<double^,3> ^Funct = gcnew array<double^,3>(3,4,36);
array<double^> ^LLmin = gcnew array<double^>(3);
array<double^> ^LLmax = gcnew array<double^>(3);
array<int^> ^Order = gcnew array<int^>(3);
LLmin[0] = *Coef1[0,0];
LLmin[1] = *Coef2[0,0];
LLmin[2] = *Coef3[0,0];
LLmax[0] = *Coef1[1,0];
LLmax[1] = *Coef2[1,0];
LLmax[2] = *Coef3[1,0];
Order[0] = (int) *Coef1[2,0];
Order[1] = (int) *Coef2[2,0];
Order[2] = (int) *Coef3[2,0];
double maxLLcut = 0.0;
double minLLcut = *LLmax[0];
for(int n=0; n<3; n++) {
if( maxLLcut < *LLmax[n]) maxLLcut = *LLmax[n];
if( minLLcut > *LLmax[n]) minLLcut = *LLmax[n];
}
int npts = 36;
if(maxLLcut != minLLcut){
npts = 35;
}
double LL = 0.05;
double DeltaLL;
double LLOrd = 1.0;
DeltaLL = minLLcut/((float) npts - 1.0);
for(int i=1; i < npts ; i++) {
Curve[i,0] = LL;
for (int n = 0; n < 4 ; n++) {
// Use polynomial coefs to calculate Volume
LLOrd = 1.0;
for(int k=3; k < *Coef1[2,n]+3; k++) {
Funct[0,n,i] = *Funct[0,n,i] +*Coef1[k,n] * LLOrd;
LLOrd = LLOrd *LL;
}
LLOrd = 1.0;
for(int k=3; k < *Coef2[2,n]+3; k++) {
Funct[1,n,i] = *Funct[1,n,i] +*Coef2[k,n] * LLOrd;
LLOrd = LLOrd *LL;
}
LLOrd = 1.0;
for(int k=3; k < *Coef3[2,n]+3; k++) {
Funct[2,n,i] = *Funct[2,n,i] +*Coef3[k,n] * LLOrd;
LLOrd = LLOrd *LL;
}
}
double BurstPerNl = 0.0;
double BurstInt = 0.0;
for(int j = 0; j<4; j++) {
if(*Funct[iL,j+1,i] == *Funct[iH,j+1,i]){
Curve[i,j+1] = *Funct[iCr,j+1,i];
}else{
BurstPerNl = (*Funct[iL,j+1,i] - *Funct[iH,j+1,i])/(*Funct[iL,0,i] - *Funct[iH,0,i]);
BurstInt = *Funct[iCr,1,i] - BurstPerNl * *Funct[iCr,j+1,i];
Curve[i,j+1] = BurstPerNl * (Vol - *Funct[iCr,0,i]) + *Funct[iCr,j+1,i];
}
}
LL = LL + DeltaLL;
}
if (npts < 36){
Curve[35,0] = maxLLcut;
for (int l = 1; l<4; l++) {
Curve[35,l] = ((*Curve[34,l] - *Curve[32,l])/(*Curve[34,0] - *Curve[32,0])) *(*Curve[35,0] - *Curve[34,0]) + *Curve[34,l];
}
}
return Curve;
}
array<double^,2> ^makeCoefs(array<double^, 2> ^Data, array<double^> ^Args) {
array<double^> ^tempCoefs = gcnew array<double^>(MAXORDER +1);
array<double^,2> ^Coefs = gcnew array<double^,2>(MAXORDER +4, 4);
int Size;
Size = Data->Length / 8;
array<double^,2> ^tempE = gcnew array<double^,2>(Size+100,2);
for(int k=0; k<Size; k++){
tempE[k,0] = 0.0;
tempE[k,1] = 0.0;
}
int m;
for(int j=0; j < 4; j++) {
for(int i = 0; i < Size; i++) {
m = j*2;
tempE[i,0] = (double) *Data[i,m];
tempE[i,1] = (double) *Data[i,m+1];
}
int k = j+2;
int Order = (int) *Args[k];
tempCoefs = polyfit(tempE, Size-1, Order);
Coefs[0,j] = *Args[0];
Coefs[1,j] = *Args[1];
Coefs[2,j] = *Args[j+2];
for(int k = 0; k < *Args[j+2]; k++) {
Coefs[3+k, j] = *tempCoefs[k];
}
}
return Coefs;
}
array<double^,2> ^fillData(int Num, array<double^> ^Args, runData ^rawData) {
// Create data sets to be fit based on cuts
int j1 = 0;
double MeasuredVolume;
array<double^,2> ^Data = gcnew array<double^,2>(Num,8);
for(int i=1; i<Num; i++) {
if(*rawData->fData1[i,0] > *Args[0] && *rawData->fData1[i,0] < *Args[1]){
MeasuredVolume = ( *rawData->fData1[i,6])/( *rawData->iData1[i,4]);
if(MeasuredVolume > -1.0*MAXVOLUME && MeasuredVolume < MAXVOLUME) {
Data[j1,0] = *rawData->fData1[i,0];
Data[j1,1] = ( *rawData->fData1[i,6])/( *rawData->iData1[i,4]);
Data[j1,2] = *rawData->fData1[i,0];
Data[j1,3] = *rawData->fData1[i,3];
Data[j1,4] = *rawData->fData1[i,0];
Data[j1,5] = *rawData->fData1[i,2];
Data[j1,6] = *rawData->fData1[i,0];
Data[j1,7] = *rawData->fData1[i,4];
j1++;
}
}
}
j1 = j1 - 1;
array<double^,2> ^newData = gcnew array<double^,2>(j1,8);
// newData = *Data;
for(int k=0; k<j1; k++){
for(int i = 0; i<8; i++){
newData[k,i] = *Data[k,i];
}
}
return newData;
}
runData ^LoadData(array<String^> ^ rawData)
{
int numLines = 0;
int numCols = 0;
int indx = 0;
int drops = 0;
array<String^,2> ^staFile1;
double WPcoefs[MAXORDER+1]; // [ = gcnew array<double^>(MAXORDER+1);
numLines = rawData->Length;
array<String^> ^Header=rawData[0]->Split(',');
numCols = Header->Length;
staFile1 = gcnew array<String^,2>(numLines,numCols);
double temp_d;
int temp_i;
runData ^filledData = gcnew runData;
// runData filledData; // = (new runData);
double vol, LL, deltaV;
for(int i=0;i<numLines;i++)
{
array<String^> ^lineSplit=rawData[i]->Split(',');
for(int j=0;j<numCols;j++){
staFile1[i,j] = lineSplit[j];
}
if(staFile1[i,8] != "11" && staFile1[i,8] != "15") {
if(i>0){
filledData->fData1[indx,1] = double::Parse(staFile1[i,27]);
filledData->fData1[indx,2] = double::Parse(staFile1[i,28]);
filledData->fData1[indx,3] = double::Parse(staFile1[i,29]);
array<String^> ^SptFreq = staFile1[i,31]->Split(':');
filledData->fData1[indx,4] = double::Parse(SptFreq[0]);
filledData->drops = (double::Parse(staFile1[i,33]));
filledData->iData1[indx,4] = filledData->drops;
LL = *filledData->fData1[indx,0];
double LLOrd = 1.0;
vol = 0.0;
for(int k=0; k <= MAXORDER; k++) {
vol = vol + *filledData->WPcoefs[k] * LLOrd;
LLOrd = LLOrd * LL;
}
filledData->fData1[indx,5] = vol;
if(indx >= 1) {
deltaV = *filledData->fData1[indx-1,5] - *filledData->fData1[indx,5];
filledData->fData1[indx-1,6] = deltaV * 1000.0;
if(*filledData->iData1[indx,4] > 0){
double Vol = ((*filledData->fData1[indx-1,6] / *filledData->iData1[indx,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
indx++;
}
}
}else{
indx++;
}
}
}
}
filledData->numLines = numLines;
filledData->numCols = numCols;
filledData->drops = *filledData->iData1[1,4];
filledData->indx = indx;
return filledData;
}
希望这些信息足够了。
问题是当按下加载第二个文件的按钮时,class 实例 LowE 被 MedE 覆盖。
所以,问题出在 class 中将数组声明为静态。显然我真正想要的是声明变量但在初始化函数中创建它。我之前试过这个,但是编译器卡住了,我认为这样做有问题。但是,一旦我确定这是解决方案,我就能让它发挥作用。静态意味着 class 的所有实例的内存都是相同的,这是共享 class 的所有实例共有的数据的便捷方式。我意识到我可以将它用于同一 class 中的另一个数组,不再需要每次都读取它。
我已尝试执行以下操作:
1) 创建一个包含托管数组的 class 2) 创建这个 class 的三个实例 3) 从三个不同的数据文件中填充这些数组。 4) 对该数据进行分析
我已经能够编译执行任务一和二的代码,但是当我填充后续实例的数组时,它们似乎会覆盖之前的数据。我尝试使用结构而不是 class。我曾尝试使用本机数组而不是托管数组。我显然在这里遗漏了一些东西,但我无法在我看过的任何地方找到我的答案。也许我不知道正确问我的问题的术语。
此外,当我使用调试器时,我发现垃圾收集器似乎在我对数据执行分析之前删除了我的数据。
如有任何帮助,我们将不胜感激。
问题是当按下加载第二个文件的按钮时,class 实例 LowE 被 MedE 覆盖。
我试图在没有发布整个项目代码的情况下提出这个问题,但没有成功所以,这就是我所拥有的:
文件runData.h
#pragma once
#define MAXPOINTS 1536
#define LDBL_MAX 1.7976931348623158e+308
#define MAXORDER 10
#define MAXVOLUME 100.0
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Diagnostics;
namespace EDCCalApp02 {
public ref class runData //: public System::ComponentModel::Component
{
public:
static array<double^> ^WPcoefs = gcnew array<double^>(MAXORDER+1);
static array<double ^,2> ^fData1 = gcnew array<double^,2>(MAXPOINTS,7);
static array<int^,2> ^iData1 = gcnew array<int^,2>(MAXPOINTS,7);
static array<int^,2> ^DataSize = gcnew array<int^,2>(3,3);
int numLines;
int numCols;
int indx;
int drops;
runData(void)
{
for (int n = 0; n<1536; n++) {
fData1[n,0] = 0.0;
iData1[n,5] = 0;
iData1[n,6] = 0;
}
}
private:
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
components = gcnew System::ComponentModel::Container();
}
#pragma endregion
};
}
文件Form1.h
#pragma once
#define MAXPOINTS 1536
#define LDBL_MAX 1.7976931348623158e+308
#define MAXORDER 10
#define MAXVOLUME 100.0
#include "runData.h"
#include "Graph1.h"
#include "Global1.h"
namespace EDCCalApp02 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;
array<double^> ^polyfit(array<double^,2> ^, int, int);
array<double^,2> ^datasort(array<double^,2> ^, int);
double ldpow( double , unsigned );
float poly_correlcoef( array<double^,2> ^ ,int, array<double^> ^, int );
array<double^> ^get_xy_max_min( array<double^,2> ^ ,int );
array<double^,2> ^fillData(int, array<double^> ^, runData ^ );
array<double^,2> ^makeCurve(array<double^,2> ^, array<double^,2> ^, array<double^,2> ^, double);
array<double^,2> ^makeCoefs(array<double^,2> ^, array<double^> ^);
runData ^LoadData(array<String^> ^);
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
int numLines = 0, numCols=0;
try{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader("WellPlate Volume Definitions.txt");
array<String^> ^lines= System::IO::File::ReadAllLines("WellPlate Volume Definitions.txt");
numLines = lines->Length;
array<String^> ^Header=lines[0]->Split(',');
numCols = Header->Length;
staVolFile = gcnew array<String^,2>(numLines,numCols);
for(int i=1;i<numLines;i++) {
array<String^> ^lineSplit=lines[i]->Split(',');
for(int j=0;j<numCols;j++){
staVolFile[i-1,j] = lineSplit[j];
}
cbx_WellPlateList->Items->Add(staVolFile[i-1,0]);
}
sr->Close();
}
catch(IOException ^) {
MessageBox::Show(L"WellPlate Volume Definitions.txt\n\n"
L"Was Not Read\n\n"
L"Please Check the File\n"
L"and Try Again");
}
}
protected:
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::TextBox^ tbx_File1;
protected:
protected:
private: System::Windows::Forms::Label^ lbl_File1;
private: System::Windows::Forms::ComboBox^ cbx_WellPlateList;
private: System::Windows::Forms::TextBox^ tbx_File2;
private: System::Windows::Forms::TextBox^ tbx_File3;
private: System::Windows::Forms::Label^ lbl_Volume;
private: System::Windows::Forms::Button^ btn_Exit;
private:
public:
array<String^,2> ^staVolFile;
static array<bool^> ^loaded = gcnew array<bool^>(4) {false,false,false,false};
static runData ^LowE = ( gcnew runData);
static runData ^MedE = ( gcnew runData);
static runData ^HighE = (gcnew runData);
private: System::Windows::Forms::OpenFileDialog^ openFileDialog1;
private: System::Windows::Forms::SaveFileDialog^ saveFileDialog1;
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
this->tbx_File1 = (gcnew System::Windows::Forms::TextBox());
this->lbl_File1 = (gcnew System::Windows::Forms::Label());
this->cbx_WellPlateList = (gcnew System::Windows::Forms::ComboBox());
this->btn_Exit = (gcnew System::Windows::Forms::Button());
this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());
this->saveFileDialog1 = (gcnew System::Windows::Forms::SaveFileDialog());
this->SuspendLayout();
//
// tbx_File1
//
this->tbx_File1->Location = System::Drawing::Point(40, 100);
this->tbx_File1->Name = L"tbx_File1";
this->tbx_File1->Size = System::Drawing::Size(267, 20);
this->tbx_File1->TabIndex = 0;
this->tbx_File1->Text = L"Enter .csv File 1";
// cbx_WellPlateList
//
this->cbx_WellPlateList->FormattingEnabled = true;
this->cbx_WellPlateList->Location = System::Drawing::Point(40, 40);
this->cbx_WellPlateList->Name = L"cbx_WellPlateList";
this->cbx_WellPlateList->Size = System::Drawing::Size(221, 21);
this->cbx_WellPlateList->TabIndex = 2;
this->cbx_WellPlateList->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::cbx_WellPlateList_SelectedIndexChanged);
this->btnFile1->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink;
this->btnFile1->Location = System::Drawing::Point(306, 98);
this->btnFile1->Name = L"btnFile1";
this->btnFile1->Size = System::Drawing::Size(25, 24);
this->btnFile1->TabIndex = 7;
this->btnFile1->UseVisualStyleBackColor = true;
this->btnFile1->Click += gcnew System::EventHandler(this, &Form1::btnFile1_Click);
// lbl_WellplateList
//
this->lbl_WellplateList->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom)
| System::Windows::Forms::AnchorStyles::Left)
| System::Windows::Forms::AnchorStyles::Right));
this->lbl_WellplateList->AutoSize = true;
this->lbl_WellplateList->Location = System::Drawing::Point(45, 25);
this->lbl_WellplateList->Name = L"lbl_WellplateList";
this->lbl_WellplateList->Size = System::Drawing::Size(98, 13);
this->lbl_WellplateList->TabIndex = 28;
this->lbl_WellplateList->Text = L"Wellplate Selection";
//
// btn_Graph1
//
this->btn_Graph1->BackColor = System::Drawing::Color::White;
this->btn_Graph1->Location = System::Drawing::Point(348, 99);
this->btn_Graph1->Name = L"btn_Graph1";
this->btn_Graph1->Size = System::Drawing::Size(38, 23);
this->btn_Graph1->TabIndex = 29;
this->btn_Graph1->Text = L"G1";
this->btn_Graph1->UseVisualStyleBackColor = true;
this->btn_Graph1->Click += gcnew System::EventHandler(this, &Form1::btn_Graph1_Click);
//
// btn_Create
//
this->btn_Create->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
this->btn_Create->Location = System::Drawing::Point(40, 292);
this->btn_Create->Name = L"btn_Create";
this->btn_Create->Size = System::Drawing::Size(75, 23);
this->btn_Create->TabIndex = 33;
this->btn_Create->Text = L"Create Cal";
this->btn_Create->UseVisualStyleBackColor = true;
this->btn_Create->Click += gcnew System::EventHandler(this, &Form1::btn_Create_Click);
this->btn_Exit->Anchor = System::Windows::Forms::AnchorStyles::Bottom;
this->btn_Exit->Location = System::Drawing::Point(657, 304);
this->btn_Exit->Name = L"btn_Exit";
this->btn_Exit->Size = System::Drawing::Size(75, 23);
this->btn_Exit->TabIndex = 36;
this->btn_Exit->Text = L"Exit";
this->btn_Exit->UseVisualStyleBackColor = true;
this->btn_Exit->Click += gcnew System::EventHandler(this, &Form1::btn_Exit_Click);
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->BackColor = System::Drawing::Color::White;
this->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"$this.BackgroundImage")));
this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;
this->ClientSize = System::Drawing::Size(830, 348);
this->Controls->Add(this->btn_Exit);
this->Controls->Add(this->btn_Graph1);
this->Controls->Add(this->lbl_WellplateList);
this->Controls->Add(this->lbl_Order1);
this->Controls->Add(this->lbl_Max1);
this->Controls->Add(this->lbl_Min1);
this->Controls->Add(this->tbx_Order1);
this->Controls->Add(this->cbx_WellPlateList);
this->Controls->Add(this->lbl_File1);
this->Controls->Add(this->tbx_File1);
this->Icon = (cli::safe_cast<System::Drawing::Icon^ >(resources->GetObject(L"$this.Icon")));
this->Name = L"Form1";
this->Text = L"EDC Calibration App";
this->ResumeLayout(false);
this->PerformLayout();
}
编译指示结束区域
私有:System::Void cbx_WellPlateList_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
double WPcoefs[MAXORDER+1];// = gcnew array<double^>(MAXORDER+1);
int selectedIndex = cbx_WellPlateList->SelectedIndex;
for(int i=0; i <= MAXORDER; i++) WPcoefs[i]=0.0;
for(int i=3;i<8;i++){
WPcoefs[i-3] = double::Parse(staVolFile[selectedIndex,i]);
}
for(int i=0;i<MAXORDER+1;i++){
LowE->WPcoefs[i] = WPcoefs[i];
MedE->WPcoefs[i] = WPcoefs[i];
HighE->WPcoefs[i] = WPcoefs[i];
}
loaded[0] = true;
}
private: System::Void btnFile1_Click(System::Object^ sender, System::EventArgs^ e) {
if(!*loaded[0]) {
MessageBox::Show("Please select a plate and try again.");
return;
}
try {
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader(openFileDialog1->FileName);
如果 (!sr) { tbx_File1->文字 = "Could not open file.";
}
String^ FilePath = openFileDialog1->FileName;
array<String^> ^File = FilePath->Split('\');
int num = File->Length;
tbx_File1->Text = File[num-1];
array<String^> ^rawData1= System::IO::File::ReadAllLines(openFileDialog1->FileName);
LowE = LoadData(rawData1);
loaded[1] = true;
sr->Close();
}
}
catch(IOException ^)
{
MessageBox::Show("File Not Read\n Please Check the File\n and Try Again");
return;
}
}
私有:System::Void btnFile2_Click(System::Object^ sender, System::EventArgs^ e) {
if(!*loaded[0]) {
MessageBox::Show("Please select a plate and try again.");
return;
}
try {
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader(openFileDialog1->FileName);
如果 (!sr) { tbx_File2->正文 = "Could not open file.";
}
String^ FilePath = openFileDialog1->FileName;
array<String^> ^File = FilePath->Split('\');
int num = File->Length;
tbx_File2->Text = File[num-1];
array<String^> ^rawData2= System::IO::File::ReadAllLines(openFileDialog1->FileName);
MedE = LoadData(rawData2);
loaded[2] = true;
sr->Close();
}
}
catch(IOException ^)
{
MessageBox::Show("File Not Read\n Please Check the File\n and Try Again");
return;
}
}
私有:System::Void btnFile3_Click(System::Object^ sender, System::EventArgs^ e) {
if(!*loaded[0]) {
MessageBox::Show("Please select a plate and try again.");
return;
}
try {
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
System::IO::StreamReader ^ sr = gcnew
System::IO::StreamReader(openFileDialog1->FileName);
如果 (!sr) { tbx_File3->文字 = "Could not open file.";
}
String^ FilePath = openFileDialog1->FileName;
array<String^> ^File = FilePath->Split('\');
int num = File->Length;
tbx_File3->Text = File[num-1];
array<String^> ^rawData3= System::IO::File::ReadAllLines(openFileDialog1->FileName);
HighE = LoadData(rawData3);
loaded[3] = true;
sr->Close();
}
}
catch(IOException ^)
{
MessageBox::Show("File Not Read\n Please Check the File\n and Try Again");
return;
}
}
私有:System::Void btn_Exit_Click(System::Object^ sender, System::EventArgs^ e) {
this->Close();
}
私有:System::Void btn_Graph1_Click(System::Object^ sender, System::EventArgs^ e) {
int Size = LowE->indx;
if(Size > 3){
array<double^,2> ^plotData = gcnew array<double^,2>(Size,4);
array<double^,2> ^fitData = gcnew array<double^,2>(Size,2);
double Min = Convert::ToDouble(tbx_Min1->Text);
double Max = Convert::ToDouble(tbx_Max1->Text);
int Ord = Convert::ToInt32(tbx_Order1->Text);
double Vol;
int count = 0;
int iData;
for(int i=1; i < Size-1 ; i++){
if((*LowE->fData1[i,0] <= Max) && (*LowE->fData1[i,0] >= Min )){
Vol = ((*LowE->fData1[i,6] / *LowE->iData1[i,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
plotData[count,0] = *LowE->fData1[i,0];
fitData[count,0] = *plotData[count,0];
iData = (int) (100.0 * *plotData[count,0]);
plotData[count,0] = iData / 100.0;
plotData[count,1] = Vol;
fitData[count,1] = Vol;
count++;
}
}
}
array<double^> ^plotCoefs = gcnew array<double^>(MAXORDER +1);
plotCoefs = polyfit(fitData,count-1,Ord);
double Delta = (Max + 0.2)/count;
plotData[0,2] = 0.0;
for(int i=0; i < count; i++) {
double LLOrd = 1.0;
plotData[i,3] = 0.0;
if(i>0) plotData[i,2] = *plotData[i-1,2] + Delta;
for(int k=0; k <= Ord; k++) {
plotData[i,3] = *plotData[i,3] +*plotCoefs[k] * LLOrd;
LLOrd = LLOrd * *plotData[i,2];
}
}
if(count > 2){
Graph1^ plot1 = gcnew Graph1(count-1,plotData);
plot1->ShowDialog();
} else{
MessageBox::Show(" Not Enough Valid Data\n Please Check the File\n and Try Again");
}
} else{
MessageBox::Show(" File Does Not Contain Enough Data\n Please Check the File\n and Try Again");
}
}
私有:System::Void btn_Graph2_Click(System::Object^ sender, System::EventArgs^ e) {
int Size = MedE->indx;
if(Size > 3){
array<double^,2> ^plotData = gcnew array<double^,2>(Size,4);
array<double^,2> ^fitData = gcnew array<double^,2>(Size,2);
double Min = Convert::ToDouble(tbx_Min2->Text);
double Max = Convert::ToDouble(tbx_Max2->Text);
int Ord = Convert::ToInt32(tbx_Order2->Text);
double Vol;
int count = 0;
int iData;
for(int i=1; i < Size-1 ; i++){
if((*MedE->fData1[i,0] <= Max) && (*MedE->fData1[i,0] >= Min )){
Vol = ((*MedE->fData1[i,6] / *MedE->iData1[i,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
plotData[count,0] = *MedE->fData1[i,0];
fitData[count,0] = *plotData[count,0];
iData = (int) (100.0 * *plotData[count,0]);
plotData[count,0] = iData / 100.0;
plotData[count,1] = Vol;
fitData[count,1] = Vol;
count++;
}
}
}
array<double^> ^plotCoefs = gcnew array<double^>(MAXORDER +1);
plotCoefs = polyfit(fitData,count-1,Ord);
double Delta = (Max + 0.2)/count;
plotData[0,2] = 0.0;
for(int i=0; i < count; i++) {
double LLOrd = 1.0;
plotData[i,3] = 0.0;
if(i>0) plotData[i,2] = *plotData[i-1,2] + Delta;
for(int k=0; k <= Ord; k++) {
plotData[i,3] = *plotData[i,3] +*plotCoefs[k] * LLOrd;
LLOrd = LLOrd * *plotData[i,2];
}
}
if(count > 2){
Graph1^ plot1 = gcnew Graph1(count-1,plotData);
plot1->ShowDialog();
} else{
MessageBox::Show(" Not Enough Valid Data\n Please Check the File\n and Try Again");
}
} else{
MessageBox::Show(" File Does Not Contain Enough Data\n Please Check the File\n and Try Again");
}
}
私有:System::Void btn_Graph3_Click(System::Object^ sender, System::EventArgs^ e) {
int Size = HighE->indx;
if(Size > 3){
array<double^,2> ^plotData = gcnew array<double^,2>(Size,4);
array<double^,2> ^fitData = gcnew array<double^,2>(Size,2);
double Min = Convert::ToDouble(tbx_Min3->Text);
double Max = Convert::ToDouble(tbx_Max3->Text);
int Ord = Convert::ToInt32(tbx_Order3->Text);
double Vol;
int count = 0;
int iData;
for(int i=1; i < Size-1 ; i++){
if((*HighE->fData1[i,0] <= Max) && (*HighE->fData1[i,0] >= Min )){
Vol = ((*HighE->fData1[i,6] / *HighE->iData1[i,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
plotData[count,0] = *HighE->fData1[i,0];
fitData[count,0] = *plotData[count,0];
iData = (int) (100.0 * *plotData[count,0]);
plotData[count,0] = iData / 100.0;
plotData[count,1] = Vol;
fitData[count,1] = Vol;
count++;
}
}
}
array<double^> ^plotCoefs = gcnew array<double^>(MAXORDER +1);
plotCoefs = polyfit(fitData,count-1,Ord);
double Delta = (Max + 0.2)/count;
plotData[0,2] = 0.0;
for(int i=0; i < count; i++) {
double LLOrd = 1.0;
plotData[i,3] = 0.0;
if(i>0) plotData[i,2] = *plotData[i-1,2] + Delta;
for(int k=0; k <= Ord; k++) {
plotData[i,3] = *plotData[i,3] +*plotCoefs[k] * LLOrd;
LLOrd = LLOrd * *plotData[i,2];
}
}
if(count > 2){
Graph1^ plot1 = gcnew Graph1(count-1,plotData);
plot1->ShowDialog();
} else{
MessageBox::Show(" Not Enough Valid Data\n Please Check the File\n and Try Again");
}
} else{
MessageBox::Show(" File Does Not Contain Enough Data\n Please Check the File\n and Try Again");
}
}
私有:System::Void btn_Create_Click(System::Object^ sender, System::EventArgs^ e) {
int i=0;
array<double^> ^Args1 = gcnew array<double^>(6) {0.0,0.0,2.0,5.0,3.0,3.0};
array<double^> ^Args2 = gcnew array<double^>(6) {0.0,0.0,2.0,5.0,3.0,3.0};
array<double^> ^Args3 = gcnew array<double^>(6) {0.0,0.0,2.0,5.0,3.0,3.0};
array<double^,2> ^Coefs1 = gcnew array<double^,2>(MAXORDER +4, 4);
array<double^,2> ^Coefs2 = gcnew array<double^,2>(MAXORDER +4, 4);
array<double^,2> ^Coefs3 = gcnew array<double^,2>(MAXORDER +4, 4);
array<double^,2> ^Curve = gcnew array<double^,2>(36, 4);
int minSz = LowE->indx;
int midSz = MedE->indx;
int maxSz = HighE->indx;
double Vol = (Convert::ToDouble(tbx_Volume->Text));
array<double^,2> ^minData, ^medData, ^maxData;
Args1[0] = (Convert::ToDouble(tbx_Min1->Text));
Args1[1] = (Convert::ToDouble(tbx_Max1->Text));
Args1[2] = (Convert::ToDouble(tbx_Order1->Text));
minData = fillData(minSz, Args1, LowE);
Coefs1 = makeCoefs(minData,Args1);
Args2[0] = (Convert::ToDouble(tbx_Min2->Text));
Args2[1] = (Convert::ToDouble(tbx_Max2->Text));
Args2[2] = (Convert::ToDouble(tbx_Order2->Text));
medData = fillData(minSz, Args2, MedE);
Coefs2 = makeCoefs(medData,Args1);
Args3[0] = (Convert::ToDouble(tbx_Min3->Text));
Args3[1] = (Convert::ToDouble(tbx_Max3->Text));
Args3[2] = (Convert::ToDouble(tbx_Order3->Text));
maxData = fillData(minSz, Args3, HighE);
Coefs3 = makeCoefs(maxData,Args1);
Curve = makeCurve(Coefs1,Coefs2,Coefs3,Vol);
array<String^,2> ^calFile = gcnew array<String^,2>(36,4);
double tempDouble;
String ^myfile = "";
saveFileDialog1->ShowDialog() ;
myfile = saveFileDialog1->FileName;
try {
FileStream ^outFile = gcnew FileStream(myfile, FileMode::Create, FileAccess::Write);
StreamWriter ^streamOut = gcnew StreamWriter(outFile);
for(i=0; i<36; i++){
tempDouble = *Curve[i,0];
calFile[i,0] = tempDouble.ToString("F2");
tempDouble = *Curve[i,1];
calFile[i,1] = tempDouble.ToString("F0");
tempDouble = *Curve[i,2];
calFile[i,2] = tempDouble.ToString("F2");
tempDouble = *Curve[i,3];
calFile[i,3] = tempDouble.ToString("F2");
streamOut->WriteLine( "{0}\t{1}\t{2}\t{3}\t{1}\t{1}\t{1}\t{1}\t{1}\t{1}\t{1}\t{1}",calFile[i,0], calFile[i,1], calFile[i,2],calFile[i,3] );
}
streamOut->Close();
}
catch(IOException ^)
{
MessageBox::Show("File Not Written\n Please Check the File\n and Try Again");
}
}
};
array<double^,2> ^makeCurve(array<double^,2> ^Coef1, array<double^,2> ^Coef2, array<double^,2> ^Coef3, double Vol) {
array<double^,2> ^Curve = gcnew array<double^,2>(36, 4);
array<double^,3> ^Funct = gcnew array<double^,3>(3,4,36);
array<double^> ^LLmin = gcnew array<double^>(3);
array<double^> ^LLmax = gcnew array<double^>(3);
array<int^> ^Order = gcnew array<int^>(3);
LLmin[0] = *Coef1[0,0];
LLmin[1] = *Coef2[0,0];
LLmin[2] = *Coef3[0,0];
LLmax[0] = *Coef1[1,0];
LLmax[1] = *Coef2[1,0];
LLmax[2] = *Coef3[1,0];
Order[0] = (int) *Coef1[2,0];
Order[1] = (int) *Coef2[2,0];
Order[2] = (int) *Coef3[2,0];
double maxLLcut = 0.0;
double minLLcut = *LLmax[0];
for(int n=0; n<3; n++) {
if( maxLLcut < *LLmax[n]) maxLLcut = *LLmax[n];
if( minLLcut > *LLmax[n]) minLLcut = *LLmax[n];
}
int npts = 36;
if(maxLLcut != minLLcut){
npts = 35;
}
double LL = 0.05;
double DeltaLL;
double LLOrd = 1.0;
DeltaLL = minLLcut/((float) npts - 1.0);
for(int i=1; i < npts ; i++) {
Curve[i,0] = LL;
for (int n = 0; n < 4 ; n++) {
// Use polynomial coefs to calculate Volume
LLOrd = 1.0;
for(int k=3; k < *Coef1[2,n]+3; k++) {
Funct[0,n,i] = *Funct[0,n,i] +*Coef1[k,n] * LLOrd;
LLOrd = LLOrd *LL;
}
LLOrd = 1.0;
for(int k=3; k < *Coef2[2,n]+3; k++) {
Funct[1,n,i] = *Funct[1,n,i] +*Coef2[k,n] * LLOrd;
LLOrd = LLOrd *LL;
}
LLOrd = 1.0;
for(int k=3; k < *Coef3[2,n]+3; k++) {
Funct[2,n,i] = *Funct[2,n,i] +*Coef3[k,n] * LLOrd;
LLOrd = LLOrd *LL;
}
}
double BurstPerNl = 0.0;
double BurstInt = 0.0;
for(int j = 0; j<4; j++) {
if(*Funct[iL,j+1,i] == *Funct[iH,j+1,i]){
Curve[i,j+1] = *Funct[iCr,j+1,i];
}else{
BurstPerNl = (*Funct[iL,j+1,i] - *Funct[iH,j+1,i])/(*Funct[iL,0,i] - *Funct[iH,0,i]);
BurstInt = *Funct[iCr,1,i] - BurstPerNl * *Funct[iCr,j+1,i];
Curve[i,j+1] = BurstPerNl * (Vol - *Funct[iCr,0,i]) + *Funct[iCr,j+1,i];
}
}
LL = LL + DeltaLL;
}
if (npts < 36){
Curve[35,0] = maxLLcut;
for (int l = 1; l<4; l++) {
Curve[35,l] = ((*Curve[34,l] - *Curve[32,l])/(*Curve[34,0] - *Curve[32,0])) *(*Curve[35,0] - *Curve[34,0]) + *Curve[34,l];
}
}
return Curve;
}
array<double^,2> ^makeCoefs(array<double^, 2> ^Data, array<double^> ^Args) {
array<double^> ^tempCoefs = gcnew array<double^>(MAXORDER +1);
array<double^,2> ^Coefs = gcnew array<double^,2>(MAXORDER +4, 4);
int Size;
Size = Data->Length / 8;
array<double^,2> ^tempE = gcnew array<double^,2>(Size+100,2);
for(int k=0; k<Size; k++){
tempE[k,0] = 0.0;
tempE[k,1] = 0.0;
}
int m;
for(int j=0; j < 4; j++) {
for(int i = 0; i < Size; i++) {
m = j*2;
tempE[i,0] = (double) *Data[i,m];
tempE[i,1] = (double) *Data[i,m+1];
}
int k = j+2;
int Order = (int) *Args[k];
tempCoefs = polyfit(tempE, Size-1, Order);
Coefs[0,j] = *Args[0];
Coefs[1,j] = *Args[1];
Coefs[2,j] = *Args[j+2];
for(int k = 0; k < *Args[j+2]; k++) {
Coefs[3+k, j] = *tempCoefs[k];
}
}
return Coefs;
}
array<double^,2> ^fillData(int Num, array<double^> ^Args, runData ^rawData) {
// Create data sets to be fit based on cuts
int j1 = 0;
double MeasuredVolume;
array<double^,2> ^Data = gcnew array<double^,2>(Num,8);
for(int i=1; i<Num; i++) {
if(*rawData->fData1[i,0] > *Args[0] && *rawData->fData1[i,0] < *Args[1]){
MeasuredVolume = ( *rawData->fData1[i,6])/( *rawData->iData1[i,4]);
if(MeasuredVolume > -1.0*MAXVOLUME && MeasuredVolume < MAXVOLUME) {
Data[j1,0] = *rawData->fData1[i,0];
Data[j1,1] = ( *rawData->fData1[i,6])/( *rawData->iData1[i,4]);
Data[j1,2] = *rawData->fData1[i,0];
Data[j1,3] = *rawData->fData1[i,3];
Data[j1,4] = *rawData->fData1[i,0];
Data[j1,5] = *rawData->fData1[i,2];
Data[j1,6] = *rawData->fData1[i,0];
Data[j1,7] = *rawData->fData1[i,4];
j1++;
}
}
}
j1 = j1 - 1;
array<double^,2> ^newData = gcnew array<double^,2>(j1,8);
// newData = *Data;
for(int k=0; k<j1; k++){
for(int i = 0; i<8; i++){
newData[k,i] = *Data[k,i];
}
}
return newData;
}
runData ^LoadData(array<String^> ^ rawData)
{
int numLines = 0;
int numCols = 0;
int indx = 0;
int drops = 0;
array<String^,2> ^staFile1;
double WPcoefs[MAXORDER+1]; // [ = gcnew array<double^>(MAXORDER+1);
numLines = rawData->Length;
array<String^> ^Header=rawData[0]->Split(',');
numCols = Header->Length;
staFile1 = gcnew array<String^,2>(numLines,numCols);
double temp_d;
int temp_i;
runData ^filledData = gcnew runData;
// runData filledData; // = (new runData);
double vol, LL, deltaV;
for(int i=0;i<numLines;i++)
{
array<String^> ^lineSplit=rawData[i]->Split(',');
for(int j=0;j<numCols;j++){
staFile1[i,j] = lineSplit[j];
}
if(staFile1[i,8] != "11" && staFile1[i,8] != "15") {
if(i>0){
filledData->fData1[indx,1] = double::Parse(staFile1[i,27]);
filledData->fData1[indx,2] = double::Parse(staFile1[i,28]);
filledData->fData1[indx,3] = double::Parse(staFile1[i,29]);
array<String^> ^SptFreq = staFile1[i,31]->Split(':');
filledData->fData1[indx,4] = double::Parse(SptFreq[0]);
filledData->drops = (double::Parse(staFile1[i,33]));
filledData->iData1[indx,4] = filledData->drops;
LL = *filledData->fData1[indx,0];
double LLOrd = 1.0;
vol = 0.0;
for(int k=0; k <= MAXORDER; k++) {
vol = vol + *filledData->WPcoefs[k] * LLOrd;
LLOrd = LLOrd * LL;
}
filledData->fData1[indx,5] = vol;
if(indx >= 1) {
deltaV = *filledData->fData1[indx-1,5] - *filledData->fData1[indx,5];
filledData->fData1[indx-1,6] = deltaV * 1000.0;
if(*filledData->iData1[indx,4] > 0){
double Vol = ((*filledData->fData1[indx-1,6] / *filledData->iData1[indx,4]));
if(Vol > -1.0*MAXVOLUME && Vol < MAXVOLUME){
indx++;
}
}
}else{
indx++;
}
}
}
}
filledData->numLines = numLines;
filledData->numCols = numCols;
filledData->drops = *filledData->iData1[1,4];
filledData->indx = indx;
return filledData;
}
希望这些信息足够了。
问题是当按下加载第二个文件的按钮时,class 实例 LowE 被 MedE 覆盖。
所以,问题出在 class 中将数组声明为静态。显然我真正想要的是声明变量但在初始化函数中创建它。我之前试过这个,但是编译器卡住了,我认为这样做有问题。但是,一旦我确定这是解决方案,我就能让它发挥作用。静态意味着 class 的所有实例的内存都是相同的,这是共享 class 的所有实例共有的数据的便捷方式。我意识到我可以将它用于同一 class 中的另一个数组,不再需要每次都读取它。