Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bemone en 24 Agosto 2013, 16:56 pm



Título: [Ayuda] Vector de punteros a objectos
Publicado por: bemone en 24 Agosto 2013, 16:56 pm
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
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #pragma hdrstop
  5.  
  6. #include "Unit1.h"
  7. #include "Cartones.h"
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. #pragma resource "*.dfm"
  11. TForm1 *Form1;
  12.  
  13. TFileStream *ioArchivo;
  14. Cartones *cCarton;
  15. vector<Cartones *> vCartones;
  16. int nCartones;
  17.  
  18. //---------------------------------------------------------------------------
  19. __fastcall TForm1::TForm1(TComponent* Owner)
  20.    : TForm(Owner)
  21. {
  22. }
  23. //---------------------------------------------------------------------------
  24.  
  25. void __fastcall TForm1::Button1Click(TObject *Sender)
  26. {
  27.    Memo1->Lines->Clear();
  28.    Memo2->Lines->Clear();
  29.    ioArchivo = new TFileStream("cartones.txt", fmCreate);
  30.  
  31.    int cantCartones = nCartones;
  32.  
  33.    for(int i=0; i<cantCartones; i++){
  34.        cCarton = new Cartones(1, 25, 15);
  35.        cCarton->setNumSerie(i+1);
  36.        cCarton->generarNumerosDeCarton();
  37.        vCartones.push_back(cCarton);
  38.    }
  39.  
  40.    // ----------------------- ACA LOS MUESTRA BIEN --------------------------
  41.    for(unsigned int i=0; i<vCartones.size(); i++){
  42.        Memo1->Lines->Append(AnsiString(vCartones[i]->getNumSerie()));
  43.        Memo1->Lines->Append(vCartones[i]->devolverNumeros()); //ESTO
  44.    }
  45.  
  46.    for(unsigned int i=0; i<vCartones.size(); i++){
  47.        Memo2->Lines->Append(AnsiString(vCartones[i]->getNumSerie()));
  48.        Memo2->Lines->Append(vCartones[i]->devolverNumeros());
  49.    }
  50.  
  51.    ioArchivo->WriteComponent(Memo2);
  52.    delete ioArchivo;
  53. }
  54. //---------------------------------------------------------------------------
  55.  
  56. void __fastcall TForm1::FormCreate(TObject *Sender)
  57. {
  58.    randomize();
  59.    nCartones = 0;
  60. }
  61. //---------------------------------------------------------------------------
  62. void __fastcall TForm1::Button3Click(TObject *Sender)
  63. {
  64.    nCartones += 3;
  65.    Label1->Caption = AnsiString(nCartones);
  66.    Label2->Caption = AnsiString(nCartones/3);
  67. }
  68. //---------------------------------------------------------------------------
  69.  
  70. void __fastcall TForm1::Button2Click(TObject *Sender)
  71. {
  72.    Memo1->Lines->Clear();
  73.    Memo2->Lines->Clear();
  74.  
  75.    ioArchivo = new TFileStream("cartones.txt", fmOpenRead | fmShareExclusive);
  76.    ioArchivo->ReadComponent(Memo2);
  77.  
  78.    vector<char> vcNumeros(25);
  79.    AnsiString aux;
  80.    int cont = 1, num = 0;
  81.  
  82.    for(int i=0; i<Memo2->Lines->Count; i+=2){
  83.        cCarton = new Cartones(1, 25, 15);
  84.        cCarton->setNumSerie(Memo2->Lines->Strings[i].ToInt());
  85.        aux = Memo2->Lines->Strings[i+1];
  86.        while(cont <= aux.Length()){
  87.            num = aux[cont];
  88.            if(num >= 1 && num <= 25)
  89.                vcNumeros[num-1] = 'X';
  90.  
  91.            cont++;
  92.        }
  93.  
  94.        cCarton->setNumeros(vcNumeros);
  95.        vCartones.push_back(cCarton);
  96.    }
  97.  
  98.    delete ioArchivo;
  99. }
  100. //---------------------------------------------------------------------------
  101.  
  102. void __fastcall TForm1::Button4Click(TObject *Sender)
  103. {
  104.    /*Cartones cCartonGanador(1, 25, 15);
  105.     cCartonGanador.generarNumerosDeCarton();
  106.     cCartonGanador.setNumerosEnteros(cCartonGanador.devolverNumeros());
  107.     Memo1->Lines->Append("Carton Ganador: ");
  108.     Memo1->Lines->Append(cCartonGanador.getNumerosEnteros());*/
  109.  
  110.    // ---------------------- ACA LOS MUESTRA MAL -----------------------
  111.    for(unsigned int i=0; i<vCartones.size(); i++){
  112.        Memo1->Lines->Append(AnsiString(vCartones[i]->getNumSerie()));
  113.        Memo1->Lines->Append(vCartones[i]->devolverNumeros()); //ESTO
  114.    }
  115.  
  116.    /*int aciertos;
  117.     for(unsigned int i=0; i<vCartones.size(); i++){
  118.         aciertos = vCartones[i]->compararCartones(cCartonGanador);
  119.         vCartones[i]->setCantNumerosAcertados(aciertos);
  120.         vCartones[i]->setNumerosEnteros(vCartones[i]->devolverNumeros());
  121.     }
  122.  
  123.     int i = 15;
  124.     for(unsigned int j=0; j<vCartones.size(); j++){
  125.         //if(vCartones[j]->getCantNumerosAcertados() == i && i >= 12 && i <= 15){
  126.             Memo1->Lines->Append("Carton: " + AnsiString(vCartones[j]->getNumSerie()) + " Aciertos: " + AnsiString(vCartones[j]->getCantNumerosAcertados()));
  127.             Memo1->Lines->Append(vCartones[j]->getNumerosEnteros());
  128.         //}
  129.             //i--;
  130.     }*/
  131. }
  132. //---------------------------------------------------------------------------
  133.  


Título: Re: [Ayuda] Vector de punteros a objectos
Publicado por: 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.


Título: Re: [Ayuda] Vector de punteros a objectos
Publicado por: bemone en 24 Agosto 2013, 19: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
  1. AnsiString Cartones::devolverNumeros(){
  2.    this->asNumeros = "";
  3.    for(unsigned int i=0; i<this->vsNumeros.size(); i++){
  4.        if(this->vsNumeros[i] == 'A' || this->vsNumeros[i] == 'X')
  5.            this->asNumeros += AnsiString(i+1) + " ";
  6.    }
  7.        return this->asNumeros;
  8. }

Gracias!!