Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con La Clase

Iniciado por shephiroth, 02 de Noviembre de 2005, 02:15:59 PM

« anterior - próximo »

shephiroth

 Buenas, primero les presento mi codigo:


class dll_struct
{
private:
char* MD5;
char* nombre;
int num;
static int contador;
public:
dll_struct(char* n, char* m)
{
 MD5 = (char*)malloc(sizeof(char)*(strlen(m)+1));
 nombre = (char*)malloc(sizeof(char)*(strlen(n)+1));
 strcpy(nombre,n);
 strcpy(MD5,m);
 num = contador;
 contador++;
}
char* getName()
{
 return nombre;
}
char* getMD5()
{
 return MD5;
}
bool compare (char* n,char* m)
{
 if ((strcmp(nombre,n)==0) && (strcmp(MD5,m)==0))
  return true;
 return false;
}
};
int dll_struct::contador = 0;
class dll
{
private:
std::vector<dll_struct*> libs;
public:
dll(){}//libs.resize(100);cant=0;}
void add (char * nombre, char * MD5)
{
 if (! existe(nombre,MD5))
 {
  dll_struct * nuevo = new dll_struct(nombre,MD5);
  libs.push_back(nuevo);
  printf("MD5:%s NOMBRE:%s\n",nuevo->getMD5(),nuevo->getName());
 }
}
void show()
{
 for (int x=0;x<libs.capacity();x++)
 {
  printf("%03i) MD5[%s] MODULO[%s]\n",x,((dll_struct*)libs[x])->getMD5(),((dll_struct*)libs[x])->getName());
 }
}
bool existe(char * nombre, char * MD5)
{
 int x;
 dll_struct * objeto;
 for (x=0;x<libs.capacity();x++)
 {
  if (((dll_struct*)libs[x])->compare(nombre,MD5))
   return true;
 }
 return false;
}
};


el main seria este



int _tmain(void)
{
dll * nuevo = new dll();
nuevo->add("chocolate","q");
nuevo->add("chocolate","w");
nuevo->add("chocolate","e");
nuevo->add("chocolate","r");
nuevo->add("chocolate","t");
nuevo->add("chocolate","y");
nuevo->add("chocolate","u");
nuevo->add("chocolate","i");
nuevo->add("chocolate","o");
nuevo->show();
return 0;
}


Basicamente voy introduciendo parejas de cadenas.....pero por alguna razon que aun no conozco (por eso vengo a preguntar) en la funcion de dll_struct::compare me salta un error de puntero no inicializado. He debujeado un poco, y al parecer en la llamada "(((dll_struct*)libs
  • )->compare(nombre,MD5))" siendo x=0 y la capacidad 6, es cuando da el problema.

    Alguien sabe a que puede deberse????

_Grey

 Las STL no son en absoluto mi expecialidad(lo siento  :P ), pero cuando te da el error?? es decir, te deja meter elementos?, hasta cual??

De todas formas, un par de consejos. cuando direccionas vector como array te devuelve el tipo de dato en el formato que contiene, vamos que no hace falta el cating, deberia vastar libs
  • ->compare(nombre,MD5);.

    Y el segundo, si te peta en el primer add() quiza sea la solucion, puedes usar un iterador para recorrer los elementos del vector con el tipo con el que los has creado.
    Es decir cambiar esto:
    Citarfor (x=0;x {
      if (((dll_struct*)libs
    • )->compare(nombre,MD5))
         return true;
      }
    Por algo mas o menos, asi:
    Citarfor (std::vector::iterator i=libs.begin();
       i!=libs.end();++i){
      // Aqui dento "i", es el elemento "actual", los recorrera todos
                    if(i->compare(nombre,MD5)) return true;
       }
    Esto ultimo lo hago por que la documentacion de MSDN que tengo no parece muy explicita y proliga en ejemplos, y ademas mi ingles es muy limitado.

    Ya nos contaras, saludos.

ethernet

 Mira bien la ayuda de los métodos antes de usarlos:

capacity() -> Number of elements for which memory has been allocated. capacity() is always greater than or equal to size()


http://www.sgi.com/tech/stl/Vector.html

gdl

 Usa size() en vez de capacity().

shephiroth

 Buenas.

_Grey:
Si me deja añadir elementos. Eso es lo que mas raro me resulta. Antes de dar error deja meter 5 elementos correctamente. El problema lo da cuando se intenta meter el sexto e intenta comprobar si ya existe.

No sabia que podia usar libs
  • ->compare(...,...), el intellinoseque del visual no sabia determinar que objeto era, e interprete que no era válido, pero probare a ver si me deja sin hacer casting.

    Lo del Iter es muy interesante, quizas pruebe usando ese sistema.

    Ethernet y gdl:
    Probare utilizando size en vez de capacity, sino pues usare el bucle de _Grey de iterator ^_^

    P.D: Ahora toy con el portatil trasteando con linux, que ya consegui activar las ventanas :D En cuanto tenga acceso al programa del codigo os comento los resultados :)

ethernet

 Es importante que uses iterators, porque si por ejemplo cambias de container no tendrás que variar el código.

shephiroth

 Buenas.

Bueno, comentaros que cambiando el size, y eliminando el cast, haciendo libs
  • ->compare() directamente ya me funciona.

    Gracias a todos ^_^






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.