[Ayuda] Vector de punteros a objectos

Iniciado por bemone, 24 Agosto 2013, 16:56 PM

0 Miembros y 1 Visitante están viendo este tema.

bemone

Hola nuevamente.
Hoy les traigo otro problemita que me tiene trabado.
El problema es el uso del vector donde tengo almacenado cada objecto.
Tengo una funcion que genero cada instancia del objecto y cuando muestro las las variables de cada objecto funciona de 10, el problema viene cuando quiero mostrar ese vector de objectos en otra funcion, este me muestra uno de los vectores que hay dentro de cada objeto pero "duplicado" cabe aclarar que nunca hago una modificacion, solamente los muestro en distintas funciones.
Este vector de objectos esta declarado de forma global.

Código (cpp) [Seleccionar]
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Cartones.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TFileStream *ioArchivo;
Cartones *cCarton;
vector<Cartones *> vCartones;
int nCartones;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Memo1->Lines->Clear();
    Memo2->Lines->Clear();
    ioArchivo = new TFileStream("cartones.txt", fmCreate);

    int cantCartones = nCartones;

    for(int i=0; i<cantCartones; i++){
        cCarton = new Cartones(1, 25, 15);
        cCarton->setNumSerie(i+1);
        cCarton->generarNumerosDeCarton();
        vCartones.push_back(cCarton);
    }

    // ----------------------- ACA LOS MUESTRA BIEN --------------------------
    for(unsigned int i=0; i<vCartones.size(); i++){
        Memo1->Lines->Append(AnsiString(vCartones[i]->getNumSerie()));
        Memo1->Lines->Append(vCartones[i]->devolverNumeros()); //ESTO
    }

    for(unsigned int i=0; i<vCartones.size(); i++){
        Memo2->Lines->Append(AnsiString(vCartones[i]->getNumSerie()));
        Memo2->Lines->Append(vCartones[i]->devolverNumeros());
    }

    ioArchivo->WriteComponent(Memo2);
    delete ioArchivo;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    randomize();
    nCartones = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    nCartones += 3;
    Label1->Caption = AnsiString(nCartones);
    Label2->Caption = AnsiString(nCartones/3);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Memo1->Lines->Clear();
    Memo2->Lines->Clear();

    ioArchivo = new TFileStream("cartones.txt", fmOpenRead | fmShareExclusive);
    ioArchivo->ReadComponent(Memo2);

    vector<char> vcNumeros(25);
    AnsiString aux;
    int cont = 1, num = 0;

    for(int i=0; i<Memo2->Lines->Count; i+=2){
        cCarton = new Cartones(1, 25, 15);
        cCarton->setNumSerie(Memo2->Lines->Strings[i].ToInt());
        aux = Memo2->Lines->Strings[i+1];
        while(cont <= aux.Length()){
            num = aux[cont];
            if(num >= 1 && num <= 25)
                vcNumeros[num-1] = 'X';

            cont++;
        }

        cCarton->setNumeros(vcNumeros);
        vCartones.push_back(cCarton);
    }

    delete ioArchivo;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
    /*Cartones cCartonGanador(1, 25, 15);
    cCartonGanador.generarNumerosDeCarton();
    cCartonGanador.setNumerosEnteros(cCartonGanador.devolverNumeros());
    Memo1->Lines->Append("Carton Ganador: ");
    Memo1->Lines->Append(cCartonGanador.getNumerosEnteros());*/

    // ---------------------- ACA LOS MUESTRA MAL -----------------------
    for(unsigned int i=0; i<vCartones.size(); i++){
        Memo1->Lines->Append(AnsiString(vCartones[i]->getNumSerie()));
        Memo1->Lines->Append(vCartones[i]->devolverNumeros()); //ESTO
    }

    /*int aciertos;
    for(unsigned int i=0; i<vCartones.size(); i++){
        aciertos = vCartones[i]->compararCartones(cCartonGanador);
        vCartones[i]->setCantNumerosAcertados(aciertos);
        vCartones[i]->setNumerosEnteros(vCartones[i]->devolverNumeros());
    }

    int i = 15;
    for(unsigned int j=0; j<vCartones.size(); j++){
        //if(vCartones[j]->getCantNumerosAcertados() == i && i >= 12 && i <= 15){
            Memo1->Lines->Append("Carton: " + AnsiString(vCartones[j]->getNumSerie()) + " Aciertos: " + AnsiString(vCartones[j]->getCantNumerosAcertados()));
            Memo1->Lines->Append(vCartones[j]->getNumerosEnteros());
        //}
            //i--;
    }*/
}
//---------------------------------------------------------------------------
Odio los tipos de variable de Windows.

eferion

No será quizás porque no has borrado el memo antes de meter los datos?

En button1click haces el clear y en button4click no.

bemone

#2
Cita de: eferion en 24 Agosto 2013, 18:55 PM
No será quizás porque no has borrado el memo antes de meter los datos?

En button1click haces el clear y en button4click no.

No creo, solamente estoy mostrando unas variables del objeto que ya cargue en otra funcion.

Te dejo un ejemplo de la salida al apretar el boton 1 y al apretar el boton4 con solo 3 cartones:
Citar
Boton1:
1
1 2 3 4 6 8 10 12 13 18 20 22 23 24 25
2
1 2 3 4 7 8 11 13 16 17 18 19 22 23 25
3
1 2 4 7 8 10 13 14 16 17 18 19 20 21 22

Boton4:
1
1 2 3 4 6 8 10 12 13 18 20 22 23 24 25 1 2 3 4 6 8 10 12 13 18 20 22 23 24 25 1 2 3 4 6 8 10 12 13 18 20 22 23 24 25
2
1 2 3 4 7 8 11 13 16 17 18 19 22 23 25 1 2 3 4 7 8 11 13 16 17 18 19 22 23 25 1 2 3 4 7 8 11 13 16 17 18 19 22 23 25
3
1 2 4 7 8 10 13 14 16 17 18 19 20 21 22 1 2 4 7 8 10 13 14 16 17 18 19 20 21 22 1 2 4 7 8 10 13 14 16 17 18 19 20 21 22

Los muestra 3 veces :S

------------------------------------------------------------------------------------------------

Perdon:

Me habia faltado poner la linea:
this->asNumeros = "";

En esta funcion:
Código (cpp) [Seleccionar]
AnsiString Cartones::devolverNumeros(){
   this->asNumeros = "";
   for(unsigned int i=0; i<this->vsNumeros.size(); i++){
       if(this->vsNumeros[i] == 'A' || this->vsNumeros[i] == 'X')
           this->asNumeros += AnsiString(i+1) + " ";
   }
       return this->asNumeros;
}


Gracias!!
Odio los tipos de variable de Windows.