Fallo al insertar estructura a vector de estructuras

Iniciado por Kaxperday, 7 Julio 2015, 14:47 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Hola tengo una función que añade a un vector de estructuras, una estructura con una ip y una mac asociada, siempre y cuando no esté añadida ya en el vector, pero al ejecutarlo me aparecen repetidas las ips con sus correspondientes macs, es frustrante. ¿donde puede estar el error?

Código (cpp) [Seleccionar]
void lista_usuarios::insertar_host(u_char* ip, u_char* mac)
{
int salida;
printf("CONTENIDO LISTA************\n");
for (int i = 0; i < usuarios.size(); i++)
{
for (int j = 0; j < 4; j++)
{
printf("%x", usuarios[i].ip[j]);
}
printf("     ");
for (int j = 0; j < 6; j++)
{
printf("%x", usuarios[i].mac[j]);
}
printf("\n");
}
printf("CONTENIDO IPS Y MAC***********\n");
for (int j = 0; j < 4; j++)
{
printf("%x", ip[j]);
}
printf("     ");
for (int j = 0; j < 6; j++)
{
printf("%x", mac[j]);
}
printf("\n");
for (int i = 0; i < usuarios.size(); i++)
{
salida = 0;
for (int j = 0; j < 4; j++)
{
if (ip[j] != usuarios[i].ip[j])
{
salida++;
break;
}
}

for (int j = 0; j < 6; j++)
{
if (mac[j] != usuarios[i].mac[j])
{
salida++;
break;
}
}
printf("salida %d\n", salida);

if (salida == 2)
{
printf(" ENTRA \n");
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
break;
}
}

if (usuarios.size() == 0)
{
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
}
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Código (cpp) [Seleccionar]
for (int i = 0; i < usuarios.size(); i++)
{
salida = 0;
for (int j = 0; j < 4; j++)
{
if (ip[j] != usuarios[i].ip[j])
{
salida++;
break;
}
}

for (int j = 0; j < 6; j++)
{
if (mac[j] != usuarios[i].mac[j])
{
salida++;
break;
}
}
printf("salida %d\n", salida);

if (salida == 2)
{
printf(" ENTRA \n");
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
break;
}
}


El if del final se ejecuta 1 vez por cada usuario. Lo que debes hacer es sacarlo del bucle, y en el bucle poner un return (o lo que quieras) si alguno se repite.

Tal como lo tienes, en cuanto encuentra 1 que es diferente, va a añadir el nuevo, y hacer break;

Kaxperday

#2
En construccion.

Solucionado.

Código (cpp) [Seleccionar]
void lista_usuarios::insertar_host(u_char* ip, u_char* mac)
{
int cont = 0, cant = 0;

for (int i = 0; i < usuarios.size(); i++)
{
cont = 0;
for (int j = 0; j < 4; j++)
{
if (ip[j] != usuarios[i].ip[j])
{
cont++;
break;
}
}

for (int j = 0; j < 6; j++)
{
if (mac[j] != usuarios[i].mac[j])
{
cont++;
break;
}
}
if (cont == 2)
cant++;
}

if (cant == usuarios.size())
{
printf(" ENTRA \n");
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
}}


Como siempre gracias ivancea XDD, no sé si tendrá algun bug ahora, parece que no.

Gracias y un saludo.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.