0

なぜこれが機能しないのかを理解するために一日中費やしました.テキストファイルから情報を抽出し、値を配列としてコンストラクターに送信しています(これは正常に機能し、値を出力できます)と表示されます。) しかし、無限ループに陥らない限り、コンストラクター内に別のクラスのオブジェクトを作成することはできません。

私のメインファイル:

int main(int argc, char** argv)
{
string line;
ifstream myfile ("test1.txt");
string rows [15];
int index = 0;

string tempForSize[5];
double * sizeArray = new double[5]; 
int firstIntOccur =0; 

string * arrForEquations = new string[12];
int equationCount = 0;

if (myfile.is_open())       {
    while ( myfile.good() )     {
        getline (myfile,line);
        rows[index] =line;
        index++;
    }
    myfile.close();
}
else 
    cout << "Unable to open file" << endl; 

for(int i=0; i <12;i++)     {
    if(rows[i].find("EQUATIONS: ")!=string::npos)       { 
        i++;
        i++;
        while(i <index) { 
            arrForEquations[equationCount]=rows[i];
            equationCount++;
            i++;
        }
        break;
    }

    if(rows[i].find(':')!=string::npos)     {
        firstIntOccur =rows[i].find(':');
        tempForSize[i].assign(rows[i],firstIntOccur+2,rows[i].size());
    }
}

for(int  i =0;i <5; i++)        {  
    sizeArray[i] = atof(tempForSize[i].c_str());
}
try
{
    string * equations = arrForEquations;
    GeneticAlgorithm a(sizeArray, equations, equationCount);
}
catch(string s)
{
    cout << s << endl;
}

return 0;

 }

GeneticAlgorithm クラスのコンストラクター:

GeneticAlgorithm::GeneticAlgorithm(double *& arr, string * sArr, int size)      {
Equation ** e = new Equation*[size];
for(int i = 0; i < size; i++)   {
    e[i] = new Equation(sArr[i]);
}
}

方程式クラスは、文字列が入力されたときに完全に機能しますが、なぜこれが機能したくないのかわかりません。

前もって感謝します。

4

2 に答える 2

2

あなたの質問に答えない簡単なメモですが、それでも指摘せざるを得ませんでした。ポインタの使用は避けてください。

// Instead of using 'string * equations = new string[12]'
std::vector<std::string> equations;

// Instead of using 'double * sizeArray = new double[5]'
std::vector<double> sizeArray;

可能な限り STL を使用してください。それらはあなたの生活を楽にするために提供されており、コードはあまり暗号化されていないように見えます.

于 2012-11-02T22:04:26.517 に答える
1

これはあなたの質問に対する答えではありませんが、他の多くの間違いを指摘し、それらがクリーンアップされると、実際に何が起こっているのかを理解できるようになるかもしれません。

最初の問題は、機能分解がないことです。関数が大きすぎるため、いくつかの小さな関数に分割する必要があります。一般に(そしていくつかの注目すべき例外があります)、関数が約8行または10行より長い場合は、リファクタリングが必要です。

より詳細な問題についてです。マジックナンバーが多すぎて、ほとんどの場合、それらは間違っています。ユーザーは正確に15行を入力しません。彼は5、または500または誰が知っているかを入力します。(もちろん、彼が500を入力した場合、大きな問題が発生します。)これを処理する最も簡単で最も一般的な方法は、std::vectorとそのpush_backメンバー関数を使用することです。これは完全ではありませんが(ユーザーが5兆行、または5兆文字の1行を入力するとどうなりますか)、ほとんどのアプリケーションでは十分です。

より一般的には、これはほとんどすべてのアレイに当てはまります。サイズstd::vectorに魔法の定数を使用するのではなく、を使用して、必要に応じて成長させます。そして、なぜ地球上で:

string tempForSize[5];
double * sizeArray = new double[5]; 

なぜ一方のケースでは動的割り当てが行われ、もう一方のケースでは動的割り当てが行われないのですか?(そのことについては、とにかく必要ありませtempForSizeん。ローカル一時で文字列値を取得したら、すぐに変換してに入れることができますsizeArray。)

ループwhile ( myfile.good() )が実際に正しくなることはありません。また、読み取りが成功するかどうかをテストせずに、line読み取りを使用します。getlineこのようなことを行う正しい方法は次のとおりです。

std::vector<std::string>
readRows( std::istream& source )
{
    std::vector<std::string> results;
    std::string line;
    while ( std::getline( source, line ) ) {
        result.push_back( line );
    }
    return results;
}

標準のベストプラクティスを使用してコードを書き直し、実際に何が起こっているかを確認できるようにします。他の多くの問題に気を取られることはありません。それでも問題が解決しない場合は、もう一度質問してください。

(BYW:地球上のどこで人々はループするという考えを得るのfile.good()ですか。それは思い浮かびます。それを示す教科書がある場合、私たちは本当にそれを循環から外すために何らかの方法で行動しなければなりません。)

于 2012-11-02T23:00:29.860 に答える