2009-03-12 14 views
-2

私は非常にtrivalオプション処理関数を持っており、私はこの関数を頻繁に入力する必要があります。だから私はベクトルを割り当てることができません。私はベクトルに要素を追加して保存できるようにする必要があるので、この関数に戻ってもそれはまだその要素です。funcからfuncへのベクトル情報を保持

vector<sStruct> * loadFile(char *myTextFile) 
{ 
    myStruct 
     sStruct; 
    vector<myStruct> 
     vectorAddress, 
     vectorData; 
vectorData = &vectorAddress; 
    string 
     feild1, feild2, feild3, feild4; 

    ifstream 
     *inFile = new ifstream; 

    inFile->open(myTextFile, ios::in); 


    if (!inFile->good()) 
    { 
     cout << "? File Doesnt Exist! " << endl; 
    } 

    while (!inFile->eof()) 
    { 

// reading a file deliimted by commas hi,hello,hey,1234 
//... 
     getline(*inFile, feild1, ','); 
     sStruct.m_1 = field1; 
     getline(*inFile, feild2, ','); 
     sStruct.m_2 = field2; 
     getline(*inFile, field3, ','); 
     sStruct.m_3; = feild3 
     getline(*inFile, feild4); 
     sStruct.m_4 = feield4; 

// saving each member of the struct in the vector 
    vectorAddress.push_back(sStruct); 

    } 

    inFile->clear(); 
    inFile->close(); 

    cout << vectorAddress.size() << endl; 
    delete inFile; 
// 
    (*vectorData) = vectorAddress; 
    return vectorData; 
} 

// This function tries despretly to add another element saved in struct member varaible 
// to the end of the vector. I need the information from the first function to be here. What i think im trying to do is refer to the same address in memory. 


vector<sStruct> * addElement(vector<sStruct> *vAddElement) 
{  
    myStruct sAddElement; // referring to the same struct. 
    vector<sStruct> vectorAddress; 
    vAddElement = &vectorAddress; 

    cout << "Enter a String: "; 
    cin >> sAddElement.feild1 // save user spec in struct member 

    vectorAddress.push_back(sAddElement); 
    cout << vectorAddress.size() << endl; 
    (*vAddElement) = vectorAddress; 
    return vAddElement; 
} 

そして、私は関数の署名を変更せずにこれを実行しようとしています。

答えて

3

まず、このタイプのリファレンスを使用すると、不要なコードが減り、NULLにすることはできません。問題へ

、一backまたはベクトルに追加されますいくつかの他の方法を使用して、ベクトルに追加し、何をやったことは、ベクターに割り当てようとしている。

vector<sStruct> *addElement(vector<sStruct> &vAddElement) { 
    myStruct sAddElement; // referring to the same struct. 

    cout << "Enter a String: "; 
    cin >> sAddElement.feild1 // save user spec in struct member 

    vAddElement.push_back(sAddElement); 
    cout << vectorAddress.size() << endl; 

    return &vAddElement; // since you said you must return a pointer (which is silly) 
         // we'll return the address of the object passed in. 
} 

EDIT:なぜポインタをあまり使用しているのですか(つまりまったく)、あなたの プログラムでは、ダイナミックアロケーションやメンバーのアドレスを絶対に必要としません。通常のスタック割り当てと参照渡しは、コードの半分(そして正しく)で同じ作業をすることができます。

EDIT:また、あなたのループが壊れているあなたは、読み取りを試みた後まで、あなたは正しくEOFのためにテストすることはできません。のような何かをする方が簡単です:

while(getline(file, line)) { /* process line */ } 

EDIT:

も、あなたのこのコードは、私はあなたにそうあなたのためにそれをrecommentよ 、あなたはそれがないと思うものに似ても似つきません知っている:

vector<sStruct> *addElement(vector<sStruct> *vAddElement) {  
    myStruct sAddElement; 

    // ... 

    vector<sStruct> vectorAddress; // creates a new *vector* on the stack 
    vAddElement = &vectorAddress; // makes vAddElement point to the new vector 
            // but does *not* effect the vector whose 
            // address you passed 

    // ... 

    vectorAddress.push_back(sAddElement); // adds an element to the new vector 
    cout << vectorAddress.size() << endl; // it's size will always be 1, 
              // since you just added the first element 

    (*vAddElement) = vectorAddress; // does absolutely nothing, you are assigning 
            // the new vector to itself 

    return vAddElement; // erroneously returns a pointer to the new vector 
          // it was allocated on the stack and no longer exists 
          // after the return, **never do that ** 
} 
+0

+1私はそれが尋ねられていたかどうかであるかどうかはかなり推測できませんでした。 –

+0

戻り値の型にポインタを使用する必要があります。 – user40120

+0

これを聞いて申し訳ありません。単純に "return&vAddElement;参照のアドレスは、その参照先のアドレスと等しいためです。 –

関連する問題