Programación General > Visual C++
Iterador Para Std::map
(1/1)
diego.martinez:
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 --- std::map<int,AGKDEVICE *> Devices;
cuando recibo una petición de alta de un device:
--- Código: Text --- if (Msg->GetTypeMsg()==TYPEMSG_PRESENCE) { if (AGKINSTALLATION::Get()->GetDevice(id)==NULL) //no esta dado de alta { time_t t=time(0); AGKDEVICE * D=new AGKDEVICE(); Traza=D; D->SetTime (t); D->SetID (id); AGKINSTALLATION::Get()->AddDevice(D); } }
Agkinstallation solo es el mapa y AddDevice solo hace
--- Código: Text --- AGKINSTALLATION::AddDevice(D){ Devices[D->GetID()]=D; }
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 --- AGKINSTALLATION * I=AGKINSTALLATION::Get(); if (I->GetDevices().size()>0) { std::map<int,AGKDEVICE*>Map=I->GetDevices(); std::map<int,AGKDEVICE*>::iterator it; for(it = I->GetDevices().begin(); it != I->GetDevices().end(); ++it) { AGKDEVICE* D=it->second; if (D->IsDisabled()) continue; <<< EXCEPCION!!! D es NULO! if (t>(time_t)(D->GetTime()+Elapse)) //timeout! { ... } } }
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:
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
diego.martinez:
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:
Navegación
Ir a la versión completa