Buenas tardes a tod@s,
Estoy haciendo un programa y tengo una función con bastantes sentencias if-else, creo que se podría reducir el código con la sentencia switch-case, pero no me funciona (creo que el problema está en reconocer cadenas de caracteres).
A continuación os dejo la función por si alguien sabe como ponerlo con la sentencia switch-case.
Un saludo!!
int Comprobar_Archivo_Conf(char *cadena,int parametro)
{
if (strcmp("energia_bolas_verdes",cadena)==0)
{
if (parametro>=500&¶metro<=1500)
{
segmento_01[ENERGIA_BOLAS_VERDES]=parametro;
return 1;
}
}
else
if (strcmp("num_bolas_rojas",cadena)==0)
{
if (parametro>3&¶metro<7)
{
segmento_01[NUM_BOLAS_ROJAS]=parametro;
return 1;
}
}
else
if (strcmp("intervalo_rojas",cadena)==0)
{
if (parametro>=3&¶metro<=6)
{
segmento_01[INTERVALO_ROJAS]=parametro;
return 1;
}
}
else
if (strcmp("intervalo_azules",cadena)==0)
{
if (parametro>=3&¶metro<=6)
{
segmento_01[INTERVALO_AZULES]=parametro;
return 1;
}
}
else
if (strcmp("num_bolas_negras",cadena)==0)
{
if (parametro>=3&¶metro<=5)
{
segmento_01[NUM_BOLAS_NEGRAS]=parametro;
return 1;
}
}
else
if (strcmp("intervalo_negras",cadena)==0)
{
if (parametro>=3&¶metro<=6)
{
segmento_01[INTERVALO_NEGRAS]=parametro;
return 1;
}
}
else
if (strcmp("bolas_verdes_pequenas",cadena)==0)
{
if (parametro>=2&¶metro<=5)
{
segmento_01[BOLAS_VERDES_PEQUENAS]=parametro;
return 1;
}
}
else
if (strcmp("puntuacion_t1_roja",cadena)==0)
{
if (parametro==100)
{
segmento_01[PUNTUACION_T1_ROJA]=parametro;
return 1;
}
}
else
if (strcmp("puntuacion_t2_roja",cadena)==0)
{
if (parametro==120)
{
segmento_01[PUNTUACION_T2_ROJA]=parametro;
return 1;
}
}
else
if (strcmp("puntuacion_t3_roja",cadena)==0)
{
if (parametro==140)
{
segmento_01[PUNTUACION_T3_ROJA]=parametro;
return 1;
}
}
else
if (strcmp("puntuacion_t4_roja",cadena)==0)
{
if (parametro==160)
{
segmento_01[PUNTUACION_T4_ROJA]=parametro;
return 1;
}
}
else
if (strcmp("puntuacion_bola_negra",cadena)==0)
{
if (parametro==200)
{
segmento_01[PUNTUACION_BOLA_NEGRA]=parametro;
return 1;
}
}
else
if (strcmp("quita_energia_roja",cadena)==0)
{
if (parametro>=10&¶metro<=25)
{
segmento_01[QUITA_ENERGIA_ROJA]=parametro;
return 1;
}
}
return 0;
} // fin funcion Comprobar_Archivo_Conf
Puedes mapear todos los resultados y así la función que comprueba los resultados se queda sin ifs
typedef struct
{
char etiqueta[100];
int index;
} Dato;
// Es un ejemplo, procura no usar variables globales
Dato[ MAX_DATOS ] datos;
void Configurar( )
{
strcpy( datos[ 0 ].etiqueta, "energia_bolas_verdes" );
datos[ 0 ].index = 0;
strcpy( datos[ 1 ].etiqueta, "num_bolas_rojas" );
datos[ 1 ].index = 1;
strcpy( datos[ 2 ].etiqueta, "intervalo_rojas" );
datos[ 2 ].index = 2;
// ...
}
int Comprobar_Archivo_Conf( char *cadena, int parametro )
{
int to_return = 0;
int i;
for ( i = 0; i< MAX_DATOS; i++ )
{
if ( strcmp( datos[ i ].etiqueta , cadena ) == 0 )
{
segmento_01[ datos[ i ].index ] = parametro;
to_return = 1;
break;
}
}
return to_return;
}
Siendo que los datos parecen ser constantes - y de cualquier modo algun mecanismo de sincronizacion seria necesario - en la misma linea (etiqueta podria ser char * ya que estamos):
const Dato datos[] =
{
{ "energia_bolas_verdes", 0},
{ "num_bolas_rojas", 1} //etc
};
//...
for (x = 0; x < sizeof(datos) / sizeof(datos[0]); ++x)
Muchas gracias por las respuestas, voy a probarlo!