Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda en código de C++

Estas en el tema de Duda en código de C++ en el foro de C/C++ en Foros del Web. A ver si alguien me puede ayudar. Tengo el siguiente código en C++ de la función main: int main() { time_t t1, t2; int x,y,*dir,ch; ...
  #1 (permalink)  
Antiguo 06/11/2008, 05:42
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Pregunta Duda en código de C++

A ver si alguien me puede ayudar.
Tengo el siguiente código en C++ de la función main:

int main()
{
time_t t1, t2;
int x,y,*dir,ch;
casillero c1,c2;
TipoDePoda poda;
booleano ok;

CLista<CPuzzle> solucion;

printf("\nEstado inicial:"); //Pedimos los datos del estado
EntradaDatos(c1,x,y); //inicial y creamos p1.
CPuzzle p1(c1,x,y);

printf("\nEstado final:"); //Pedimos los datos del estado
EntradaDatos(c2,x,y); //final y creamos p2.
CPuzzle p2(c2,x,y);

printf("\nQue heuristica quieres usar?");
printf("\n\t(1) Aciertos.\n\t(2) Distancias.\n");
printf("\t? ");
scanf("%i",&x);

if (x==1) p1.UsarH(aciertos); //Elegimos la heuristica a utilizar
else p1.UsarH(distancias);

printf("\nQue tipo de poda quieres usar?");
printf("\n\t(1) Sin poda. \n\t(2) Poda parcial.\n\t(3) Poda total.\n");
printf("\t? ");
scanf("%i",&x);
if(x==1) poda=sinPoda; // Y el tipo de poda
if(x==2) poda=podaParcial;
if(x==3) poda=podaTotal;

dir=(int *) &costeOperador; //Apunta al vector de costes de los
//operadores.
//Con todos los datos creamos una instancia de 'problema'
CProblema<CPuzzle> problema(p1,p2,4,dir,50);
IDA<CPuzzle> algoritmo(&problema);

//Resolvemos el puzzle
t1=time(NULL);
algoritmo.BuscarSolucion(&solucion,poda);
t2=time(NULL);
printf("\n");
x=-1;
while (!solucion.EsVacia()) //Si hay solucion...
{
solucion.Extraer(p1);
printf("Estado %i: ",++x); //...la presentamos por pantalla
p1.Dibujar();
ch=getchar();
}

//Presentacion del resto de los datos.
printf("\nTiempo: %f",difftime(t2,t1));
printf("\nLongitud de la solucion: %i",algoritmo.LongitudSolucion());
printf("\nNumero de nodos expandidos: ");
cout << algoritmo.NodosExpandidos();
printf("\nPenetracion (L/T): %f",algoritmo.Penetracion());
double sol=algoritmo.FacRamificacion(ok);
printf("\nFactor de ramificacion: %f",sol);
if (ok) printf(" (OK)\n");
if (!ok) printf(" (FALLO)\n");
printf("Comprobacion: %f",func(sol));
printf("\nMaximo nivel del arbol (maximo numero de nodos\nen memoria simultaneamente): %i\n",
algoritmo.MaximoNivel());

}

Cuando lo compilo, me da el siguiente error:

Message
In function ‘int main()’
No matching function for cal to ‘IDA<CPuzzle>::BuscarSolucion(CLista<CPuzzle>*, TipoDEPODA&)’
Candidates are: int IDA<X>::BuscarSolucin(CLixta<X>&, TipoDePoda) [with X=CPuzzle]
[Build Error]:[ida.o] Error 1


En concreto es la línea que anteriormente he marcado en rojo. El código de la función que da el error es el siguiente:

template <class X> booleano IDA<X>::BuscarSolucion(CLista<X> &lista, TipoDePoda p)
{
booleano ok; //indicar cu ndo hay soluci¢n.
CNodoHeur<X> actual;

poda=p; //Tipo de poda a realizar

//El nodo actual es el de la cabeza de la lista ( rbol)
actual=arbol.VerCabeza();
//Como primer l¡mite-f cogemos el valor F del nodo ra¡z:
coste limF=actual.F();

do { //Repetimos la llamada a ContornoDFS hasta tener soluci¢n o
printf("\nLimite F: %i",limF); //llegar al coste m ximo.
nivel=1;
limF=ContornoDFS(limF, ok);}
while ( (!ok) && (limF<problema->costeMaximo) );

if (ok) //Si hay soluci¢n extraemos los nodos de la ruta soluci¢n,
{ //de tipo CNodoHeur<X>, y los insertamos en una lista de tipo
//X, que ser la que se devuelva.

longitudSolucion=-1;
while (!arbol.EsVacia()) //Mientras haya nodos en el rbol
{
arbol.Extraer(actual); //Los extraemos
lista.Insertar(actual.Estado()); //insertamos el
longitudSolucion++; //ESTADO en otra lista e
//incrementamos la long. de la soluci¢n
}
}

return ok;
}

No sé si tendréis los datos suficientes para ayudarme, si necesitáis cualquier otra cosa, por favor, comunicármelo. Lo necesito urgentemente. Siento mucho la parrafada.

Muchas gracias, saludos.
  #2 (permalink)  
Antiguo 06/11/2008, 06:12
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda en código de C++

Mi C++ está un poco oxidado, pero ¿no debería ser:
Código cpp:
Ver original
  1. template <class X> booleano IDA<X>::BuscarSolucion(CLista<X> * lista, TipoDePoda p)
en lugar de
Código cpp:
Ver original
  1. template <class X> booleano IDA<X>::BuscarSolucion(CLista<X> &lista, TipoDePoda p)
?

(Igual digo una tontería, pero vamos, es lo que me suena)
  #3 (permalink)  
Antiguo 10/11/2008, 02:46
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Duda en código de C++

Hola venkman

Muchas gracias por tu colaboración, pero ya probé la posibilidad que me comentas y tampoco funciona

Saludos
  #4 (permalink)  
Antiguo 10/11/2008, 08:43
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda en código de C++

¿Qué son sinPoda, podaParcial y podaTotal? (Es decir, de dónde salen?)
  #5 (permalink)  
Antiguo 11/11/2008, 03:40
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Duda en código de C++

Es el tipo de poda que queremos hacerle al árbol que va obteniendo la solución.

- PodaParcial: Comprobamos que el 'abuelo' del nodo no contenga el mismo estado. Poda rápida de realizar y muy efectiva.
- PodaTotal: Comprobamos todos los nodos del *árbol. Es una poda más lenta y ligeramente más efectiva (en cuanto a número de nodos podados).
- SinPoda: No realizamos ninguna poda al árbol.

Estos datos se obtienen en la función main, se la pedimos al usuario para que el usuario decida qué poda desea realizar.

TipoDePoda es un tipo enumerado que lo tengo definido de la siguiente forma:
Código:
enum TipoDePoda {sinPoda, podaParcial, podaTotal};
¿Quieres que te envíe el código completo?, si es así, ¿a qué dirección?.

Muchas gracias por tu tiempo y tu ayuda
  #6 (permalink)  
Antiguo 11/11/2008, 06:16
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda en código de C++

Aha, es un enum. Igual digo una tontería, pero me suena que entonces la declaración de la función debería ser:

Código cpp:
Ver original
  1. template <class X> booleano IDA<X>::BuscarSolucion(CLista<X> * lista, TipoDePoda & p)

De hecho, según el mensaje del error, es a lo que estás intentando llamar.
  #7 (permalink)  
Antiguo 11/11/2008, 06:27
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Duda en código de C++

En caso de poner la declaración de la función como dices, ¿tendría que cambiar también algo en la llamada de la función?,¿y en la definición de la función BuscarSolucion?.

Ya tengo un lío que no me aclaro, si cambio la declaración pero no cambio ni la llamada el error ni nada dentro de la función, el error sigue siendo el mismo
  #8 (permalink)  
Antiguo 11/11/2008, 07:17
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda en código de C++

En principio, sólo tendrías que cambiar la función (tanto la declaración como la definición, claro), pero no la llamada.

Lo único que no me termina de convencer es que en el error aparece:
No matching function for cal to ‘IDA<CPuzzle>::BuscarSolucion(CLista<CPuzzle> *, TipoDEPODA&)’ escrito así, con esas mayúsculas. Sí?
  #9 (permalink)  
Antiguo 12/11/2008, 02:57
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Duda en código de C++

Perdón, eso ha sido un error mío, en realidad pone:

No matching function for cal to ‘IDA<CPuzzle>::BuscarSolucion(CLista<CPuzzle> *, TipoDePoda&)’

¿Se te ocurre alguna otra posibilidad que pueda causar el error?
  #10 (permalink)  
Antiguo 12/11/2008, 04:10
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda en código de C++

Pues no se me ocurre. Lo siento.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:37.