Aquí podría ser tu PUBLICIDAD


Mantener la información en el vector de func a func

votos
-2

Tengo una función de procesamiento de opciones muy trival y necesito ingresar a esta función de vez en cuando. Entonces no puedo asignar el vector. Necesito poder agregar un elemento al vector y guardarlo así que cuando vuelvo a esta función sigue siendo su.

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;
}

Y estoy tratando de hacer esto sin cambiar las signuaturas de funciones.

Publicado el 12/03/2009 a las 19:39
fuente por usuario user40120
En otros idiomas...        العربية       

1 respuestas

votos
3

En primer lugar, use referencias para este tipo de cosas, reduce el código innecesario y no puede ser NULO.

sobre el tema, para agregar a un vector, use push_back o algún otro método que se sume a un vector, lo que ha hecho es intentar asignarlo al vector:

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.
}

EDITAR: ¿Por qué está utilizando tanto punteros (en absoluto) no es absolutamente necesario en su programa para cualquier tipo de asignación dinámica o tomar la dirección de los miembros. La asignación de stack habitual y pass by reference le permiten hacer el mismo trabajo con la mitad del código (y correctamente).

EDITAR: Además, su bucle está roto, no puede realizar la prueba de EOF correctamente hasta después de intentar una lectura. Es más fácil hacer algo como:

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

EDITAR:

también este código tuyo no está ni cerca de lo que crees que es, lo recomiendo para que sepas:

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 **
}
Respondida el 12/03/2009 a las 08:02
fuente por usuario Evan Teran


Aquí podría ser tu PUBLICIDAD