Ver Mensaje Individual
  #21 (permalink)  
Antiguo 28/12/2012, 14:19
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 5 meses
Puntos: 83
Respuesta: Lectura de archivo en C++

El tema de listas es cuestion de estar un rato delante practicando; para recorrer la lista generados (este bucle reemplaza el que tienes en la linea 99 while (!generats.empty()){...)

Código:
list <DADES_ARXIU>::iterator itr_generats;
for(itr_generats = generats.begin(); itr_generats != generats.end(); itr_generats++) {
    //printf("T=%f", (*itr_generats).T);//ejemplo para acceder al dato T
}
Lo que te interesa: itr_generats son iteradores de elementos de la lista, en este caso son posiciones de structs DADES_ARXIU ubicadas en 'generats'. Si usaras tipos de datos en vez de structs, el propio iterador puede comportarse como el tipo que representa, pero al usar structs tienes que desreferenciar el iterador para que se comporte como la struct, por eso haces lo de (*itr_generats).T para acceder al elemento T que está dentro del struct DADES_ARXIU que esta guardado en la lista 'generats' y que está siendo apuntado por 'itr_generats'. Si en vez de una lista se structs tuvieras una lista de punteros a structs (no es tu caso, solo completo la explicacion) tendrias que desreferenciar igualmente el iterador y luego aplicar el puntero dentro de referencias a structs (*itr_generats)->T ok? En cualquier caso, tanto si usas structs como si usas tipos 'normales' (enteros o lo que sea), la desreferenciacion del iterador se comporta como el tipo de dato esperado.

Y ahora lo que te interesa mas aun: como buscas dentro de la otra lista algun tipo de colision? Dos formas, o recorres la otra lista hasta dar con lo que buscas, o usas alguna funcion de c++ que te permita hacer comparaciones (lo siguiente lo digo de memoria, deberias consultarlo: las funciones find, find_if, search y tal vez otra te podran servir, no se si todas sirven para trabajar con iteradores de struct).

Con otro iterador, y por ejemplo si quieres encontrar los recibidos que coinciden en O y D con los generados, haras algo asi:

Código:
list <DADES_ARXIU>::iterator itr_generats;
list <DADES_ARXIU>::iterator itr_rebuts;

for(itr_generats = generats.begin(); itr_generats != generats.end(); itr_generats++) {
    for(itr_rebuts = rebuts.begin(); itr_rebuts != rebuts.end(); itr_rebuts++) {
        if(((*itr_generats).O == (*itr_rebuts).O) && ((*itr_generats).D == (*itr_rebuts).D)) {
            //ya lo tienes
        }
    }
}
(tal vez en el caso de O y D que son strings no sea esta la mejor forma de hacer la comparacion, pero como ejemplo ya sirve)

Ten en cuenta que en un archivo que resulta gg generados y rr recibidos se haran un total de gg * rr comprovaciones; si las comprovaciones solo requieren encontrar la primera colision asegurate de salir del bucle interno enseguida para minimizar el tiempo de ejecucion.

vosk

Última edición por vosk; 29/12/2012 a las 10:32