Tengo un problema que me frie la sangre.
Tengo esto en un archivo:
HILO(DesplazamientoPersonaje,parametro)
{
Datos* param = (Datos*) parametro;
switch (param->Orientacion)
{
case ARRIBA:
Transicion(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
break;
case ABAJO:
Transicion(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
break;
case IZQUIERDA:
Transicion(param,-1,0); // Etc
break;
case DERECHA:
Transicion(param,1,0);
break;
}
delete param;
}
void Transicion(Datos* param,short incrx,short incry)
{
for (short ini = 1; ini < 21; ini++)
{
//Blablablabla...
}
}
Y en otro archivo tengo:
HILO(Desplazamiento,parametro)
{
Datos* param = (Datos*) parametro;
switch (param->Orientacion)
{
case ARRIBA:
Transicion2(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
break;
case ABAJO:
Transicion2(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
break;
case IZQUIERDA:
Transicion2(param,-1,0); // Etc
break;
case DERECHA:
Transicion2(param,1,0);
break;
}
delete param;
}
void Transicion2(Datos* param,short incrx,short incry)
{
for (short ini = 1; ini < 21; ini++)
{
// blablabla
if (param->Valor == 1)
circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);
if (param->Valor == 2)
circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);
// blablablabla
}
}
Son muy parecidas, las unicas diferencia son los dos ifs de la función for. Hay alguna forma (sencilla) de juntar las dos funciones pero conservando los dos ifs? :-\
Entiendo que los dos archivos tienen que coexistir en el programa a la vez, no ?
Si estás en c, yo creo que la mejor opción es tener una variable que redirija el flujo del programa en una dirección u otra. Lo más normal sería añadir un 4º parámetro a la función para elegir el camino... un int que haga las veces de booleano, por ejemplo.
Si no, también podrías sacar lo que es común a dos funciones independientes ( funcA ( para lo que hay antes del if ) y funcB ( para lo que hay después ), de tal forma que:
void Transicion(Datos* param,short incrx,short incry)
{
for (short ini = 1; ini < 21; ini++)
{
funcA( param, incrx, incry, i );
funcB( param, incrx, incry, i );
}
}
void Transicion2(Datos* param,short incrx,short incry)
{
for (short ini = 1; ini < 21; ini++)
{
funcA( param, incrx, incry, ini );
if (param->Valor == 1)
circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);
if (param->Valor == 2)
circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);
funcB( param, incrx, incry, ini );
}
}
Si estás en c++ podrías crear dos clases tal que una herede de la otra y sobreescriba la función o... si quieres aprovechar al máximo el código... que sobreescriba una función secundaria.
Me explico:
class A
{
public:
void Transicion( Datos* param, short incrx, short incry )
{
// ...
FuncIf( );
// ...
}
private:
virtual void FuncIf( Datos* param, short incrx, short incry )
{ }
};
class B : public A
{
virtual void FuncIf( Datos* param, short incrx, short incry )
{
if ( ... )
}
}
Cita de: eferion en 11 Julio 2013, 08:29 AMLo más normal sería añadir un 4º parámetro a la función para elegir el camino... un int que haga las veces de booleano, por ejemplo.
Perfecto, simplemente he pasado un valor "nulo" en el caso 1 y de esa forma los ifs no se cumplen:
HILO(Desplazamiento,parametro)
{
Datos* param = (Datos*) parametro;
switch (param->Orientacion)
{
case ARRIBA:
Transicion(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
break;
case ABAJO:
Transicion(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
break;
case IZQUIERDA:
Transicion(param,-1,0); // Etc
break;
case DERECHA:
Transicion(param,1,0);
break;
}
delete param;
}
void Transicion(Datos* param,short incrx,short incry)
{
for (short ini = 1; ini < 21; ini++)
{
// Blablablabla...
if (param->Valor == 1)
circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);
if (param->Valor == 2)
circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);
// Blablablabla...
}
}
Cita de: amchacon en 11 Julio 2013, 10:48 AM
Perfecto, simplemente he pasado un valor "nulo" en el caso 1 y de esa forma los ifs no se cumplen:
Me encanta cuando las cosas salen de forma tan sencilla.
A mi modo de ver es un indicativo de que el código está bien diseñado.