› Foros › PC › Software libre
void processarArguments (int fargc, char **fargv,char *ptasqGlobals,char *pperEtapa,char *petapes,char *preparticio,char *pminComput,char *pmaxComput,char *pcomput,char *puserComput,char *pminComunicacio,char *pmaxComunicacio,char *pcomunicacio,char *puserComunicacio)
{
int i=0;
ptasqGlobals=petapes=0;
preparticio=0;
pperEtapa="n";
for (i=0;i<=fargc; i++)
{
switch (fargv[i])
{
case "-et": //controlem el nombre d'etapes
if (EsNumero(fargv[i+1])==0)
{
petapes=fargv[i+1];
i++;
break;
}
else
{
ErrorP("etapes");
exit (EXIT_FAILURE);
}
case "-tgl": // controlem si entre el nombre de tasques globals
if (EsNumero(fargv[i+1])==0)
{
ptasqGlobals=fargv[i+1];
i++;
break; // saltem a l'inici del bucle
}
else
{
ErrorP("globals");
exit (EXIT_FAILURE);
}
case "-tet": //controlem si vol entrar l'usuari les tasques per etapa
pperEtapa="s";
case "-re": // controlem que entre la repartició, per defecte aleatoria
if (EsNumero(fargv[i+1])==0 && atoi(fargv[i+1])>=0 && fatoi(fargv[i+1])<=4)
{
preparticio=fargv[i+1];
i++;
break;
}
else
{
ErrorP("reparticio");
exit (EXIT_FAILURE);
}
case "-comp": //controlem que entre el comput
if (EsInterval(fargv[i+1])==0) //Aleatori, usuari entre mínim i màxim
{
sscanf(fargv[i+1],&pminComput,&pmaxComput);
i++;
break;
}
else
{
if (EsNumero(fargv[i+1])==0 && atoi(fargv[i+1])>0)//Totes iguals, usuari entre quan val el comput
{
pcomput=fargv[i+1];
i++;
break;
}
else
{
if (strcmp(fargv[i+1],"user")==0)//Es l'usuari qui entre els computs
{
puserComput='s';
i++;
break;
}
else
{
ErrorP("comput");
exit (EXIT_FAILURE);
}
}
}
..................(y sigue)
parametres.c: In function 'main':
parametres.c:38: error: switch quantity not an integer
parametres.c:40: error: case label does not reduce to an integer constant
parametres.c: In function 'processarArguments':
parametres.c:62: error: switch quantity not an integer
parametres.c:64: error: case label does not reduce to an integer constant
parametres.c:77: error: case label does not reduce to an integer constant
parametres.c:90: error: case label does not reduce to an integer constant
parametres.c:93: error: case label does not reduce to an integer constant
parametres.c:106: error: case label does not reduce to an integer constant
parametres.c:109: warning: passing argument 2 of 'sscanf' from incompatible pointer type
parametres.c:125: warning: assignment makes pointer from integer without a cast
parametres.c:137: error: case label does not reduce to an integer constant
parametres.c:140: warning: passing argument 2 of 'sscanf' from incompatible pointer type
parametres.c:156: warning: assignment makes pointer from integer without a cast
parametres.c:40: error: case label does not reduce to an integer constant
He estado leyendo en google, y parece que és porque el switch no puede ir dentro de un for, o tener un argumento variable como parametro.
O sea, que la solucion más acorde con el problema y mas "limpia" es sustituir los case por if's no?
switch (a)
{
case 0: /* algo */ break;
case 1: /* otra cosa */ break;
default: /* y esto */ break;
}
# a está en un registro 'inventado' $a
beq $a,$L0 # case 0
cmpeq $a,1,$1 # case 1 (primera parte)
bne $1,$L1 # case 1 (segunda parte)
br $L2 # default
$L0:
# algo
b $L3
$L1:
# otra cosa
b $L3
$L2:
# y esto
$L3:
# Fin del switch
if (algo)
/* una cosa */
else if (otro)
/* otra cosa */
...
else
/* una tercera */
# $1 contiene el resultado de ejecutar 'algo'
beq $1,$L1
# Recalculamos $1 con el resultado de otro
beq $1,$L2
[....]
# Este es el else, salto incondicional
br $LN
$L1:
# una cosa
b $LF
$L2:
# otra cosa
b $LF
[....]
$LN:
# una tercera
$LF:
# fin de la construcción
Ferdy escribió:Espero que esto te aclare las cosas. Y no solo a ti, si no también a alguno que yo me sé que está aprendiendo C
Ah, ¿pero C se termina de aprender alguna vez?
PD: Va a ser que sí te estás haciendo viejo, ya empieza a pegar la hebra "sin venir a cuento".
typedef struct ejemplo_s {
void *data;
int clave;
} ejemplo;
int comparar_ej(const void *a,const void *b)
{
int pri = ((ejemplo *)a)->clave;
int seg = ((ejemplo *)b)->clave;
if (pri<seg)
return -1;
else if (pri>seg)
return 1;
else
return 0;
}
[ $ ~ ] cat blah.c
#include <stdio.h>
#include <stdlib.h>
typedef struct ejemplo_s {
char *data;
int clave;
} ejemplo;
int comparar_ej(const void *a,const void *b)
{
int pri = ((ejemplo *)a)->clave;
int seg = ((ejemplo *)b)->clave;
if (pri<seg)
return -1;
else if (pri>seg)
return 1;
else
return 0;
}
int main(int argc,char **argv)
{
int i;
ejemplo x[2];
x[0].clave = 4;
x[0].data = (char *)strdup("Hola");
x[1].clave = 2;
x[1].data = (char *)strdup("Adios");
qsort((void *)x,2,sizeof(ejemplo),comparar_ej);
for ( i = 0 ; i < 2 ; i++ )
printf("(%d) %s\n",x[i].clave,x[i].data);
return 0;
}
[ $ ~ ] make blah
cc blah.c -o blah
[ $ ~ ] ./blah
(2) Adios
(4) Hola
[ $ ~ ]
Se me ocurre que en casos donde necesites velocidad y se prefiera un switch a la hora de comparar cadenas se pueden convertir a enteros (un máximo de 4 caracteres para un int y 8 para long int, por el número de bytes de cada tipo)
Ferdy escribió:No lo debí entender bien, porque no veo la mejora de velocidad :/
Tengo entendido que un switch es más rapido que varios if. Si no es así, no tiene ningun sentido, claro.
No claro, sigue siendo O(n) pero segun que casos puede ser interesante reducir el coste aunque solo sea por un factor. Por ejemplo, en un emulador se podria usar un switch para proceder segun el codigo de operacion, con ifs seria más lento aunque del mismo orden. No es lo mismo que vaya a 12FPS que a 24FPS.
¿tienes exámen mañana ó algo así?
Raharu escribió:Por ejemplo, en un emulador se podria usar un switch para proceder segun el codigo de operacion, con ifs seria más lento aunque del mismo orden. No es lo mismo que vaya a 12FPS que a 24FPS.