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 中的另一个数组,不再需要每次都读取它。