• Viernes 1 de Noviembre de 2024, 08:35

Autor Tema:  Iterador Para Std::map  (Leído 1443 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Iterador Para Std::map
« en: Jueves 29 de Noviembre de 2007, 09:24 »
0
Buenas:

Tengo un std::map con información sobre unos dispositivos que van dandose de alta a tiempos aleatorios.

el mapa es
Código: Text
  1.  
  2. std::map<int,AGKDEVICE *> Devices;
  3.  
  4.  

cuando recibo una petición de alta de un device:

Código: Text
  1.  
  2. if (Msg->GetTypeMsg()==TYPEMSG_PRESENCE)
  3.   {
  4.     if (AGKINSTALLATION::Get()->GetDevice(id)==NULL) //no esta dado de alta
  5.     {
  6.       time_t t=time(0);
  7.       AGKDEVICE * D=new AGKDEVICE();
  8.       Traza=D;
  9.         D->SetTime  (t);
  10.         D->SetID  (id);    
  11.       AGKINSTALLATION::Get()->AddDevice(D);
  12.     }
  13.   }
  14.  
  15.  

Agkinstallation solo es el mapa y AddDevice solo hace  

Código: Text
  1.  
  2. AGKINSTALLATION::AddDevice(D)
  3. { Devices[D->GetID()]=D; }
  4.  
  5.  

hasta aqui yo creo que todo bien.

ahora , quiero iterar todos los devices que me han llegado hasta ahora para ver a que hora llegaron:

Código: Text
  1.  
  2.   AGKINSTALLATION * I=AGKINSTALLATION::Get();
  3.   if (I->GetDevices().size()>0)
  4.   {
  5.     std::map<int,AGKDEVICE*>Map=I->GetDevices();
  6.     std::map<int,AGKDEVICE*>::iterator it;
  7.     for(it = I->GetDevices().begin(); it != I->GetDevices().end(); ++it)
  8.     {
  9.      
  10.       AGKDEVICE* D=it->second;
  11.       if (D->IsDisabled()) continue;   <<< EXCEPCION!!! D es NULO!
  12.  
  13.       if (t>(time_t)(D->GetTime()+Elapse)) //timeout!
  14.       {
  15.                            ...
  16.                          }
  17.                 }
  18.         }
  19.  
  20.  

El problema me llega al iterar, el iterador lleva un Device Nulo cuando it = begin().
Debugeando , veo que en el Mapa esta bien insertado el Device.
Yo sospecho que el std::map pueda estar mal iterado, alguien sabe si es eso, y si lo es , como deberia hacer la iteración?

en Google siempre empiezan a iterar por Find, pero yo no se cuales estan dados de alta en el momento del checkeo.

Otra cosa, yo creia que en la adición del for debia ponerse it++ , sin embargo he visto en ejemplos del google que lo preincrementan. Por que es esto?


Muchas gracias.

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Iterador Para Std::map
« Respuesta #1 en: Sábado 1 de Diciembre de 2007, 15:42 »
0
Hola diego, una vez hice esto std::vector<char*> vectorChar;


resulta que cuando se le pasan apuntadores a un container de stl todos los elementos van a ser el mismo porque comparten  la misma memoria, no importa cuantos elementos diferentes le metí siempre quedaba el último insertado. Pueder ser que esté ocurriendo lo mismo con el mapa.

std::map<int,AGKDEVICE *> Devices;


AGKDEVICE puede estar siendo apuntando a nulo.
PD: "Debugear" no existe en español, Se usa depurar que es el verbo correcto
Inside the code

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Iterador Para Std::map
« Respuesta #2 en: Lunes 3 de Diciembre de 2007, 08:55 »
0
pues era eso exactamente, estaban apuntando al mismo elemento, muchas gracias por la respuesta, que tonteria, si no hubiera estado de marathon programadora lo habria visto :P

PD: perdon, es que a veces me salen las palabras en ingles y no me acuerdo de decirlas en castellano :unsure: