• Miércoles 20 de Noviembre de 2024, 12:19

Autor Tema:  Resolver Sudoku  (Leído 4917 veces)

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Resolver Sudoku
« en: Viernes 22 de Septiembre de 2006, 16:36 »
0
Saludos, como andan??? Hace mucho que no escribo.... Pero bueno, tengo un problema y pensé en que talvez alguien pueda ayudarme. Resulta que estoy haciendo un programa para que cargue y resuelva "un" sudoku (famoso juego japonés, creo) El problema es que por alguna razón, al vaciar una de las tres listas (como tipo de dato abstracto (TDA)) que uso, me para el programa para mostrarme "Invalid pointer operation" (en el TDA! Muy raro, simplemente porque una lista es una estructura muy simple de "hacer"…) que significa, dispose(nil) o dispose(ptrnovalido), pero NO ES CIERTO! De hecho, le seguí el paso y adivinen:
Estaba lo mas bien, yo, viendo el "watches", mientras se ejecutaba el programa leía una línea que no tenia nada que ver con ninguna de las lista, cuando de repente apareció, en la lista en cuestión, un elemento agregado con una dirección de memoria rarísima, entonces trate de ver que elemento podría tener; al abrirlo, resulto que si era “basura”. Esto me parece imposible, pero como sucedió debe ser que si es posible… Pascal andará mal? Otra cosa es que yo nunca me “meto” en la implementación de las listas, por lo que cualquier tipo de error del la clase que les menciones, no deberían ocurrir…
Que tienen para decirme?
   
Gracias por leer mi mensaje.

PD: Si quieren les publico la parte del codigo "problematico".

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #1 en: Viernes 22 de Septiembre de 2006, 18:56 »
0
No estaría mal que publiques el código problemático pero creo que no solucionaría nada, ya que según cuentas, el problema no está allí sino que en la implementacion de la lista enlazada. ¿La lista la hiciste vos, o estas usando una hecha por terceros?

Que compilador usas, TP? o Free Pascal.?

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #2 en: Viernes 22 de Septiembre de 2006, 19:04 »
0
Yo uso turbo pascal 7 (Tambien intente con free pascal, pero sucede lo mismo). Todo el TDA Lista me lo dieron en la universidad, igual yo lo verifique denuevo, y para mi esta todo bien...

Que problema!

Aca les dejo el codigo de la lista en el procedimiento que me sale el error, quien sabe, talvez si hay un error....
Código: Text
  1.  
  2.          TipoPosicion=Integer;
  3.   PtrLista=^NodoLista;
  4.  
  5.   NodoLista=Record
  6.       Elem:TelemC;
  7.       sig:PtrLista;
  8.       end;
  9.  
  10.   Lista=Record
  11.                     List:PtrLista;
  12.                     Long:Integer;
  13.                     end;
  14.  
  15. Procedure VaciarLista(Var L:lista);
  16. var
  17. temp:ptrLista;
  18. Begin
  19.         while (L.Long>0) and (L.List<>nil) do
  20.   Begin
  21.     temp:=L.List;
  22.     L.List:=L.List^.sig;
  23.     EliminarElemC(Temp^.Elem);
  24.     dec(L.Long);
  25.     dispose(temp);
  26.   end;
  27.   L.long:=0;
  28.   L.List:=NIL;
  29. end;
  30.  
  31.  

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #3 en: Viernes 22 de Septiembre de 2006, 19:52 »
0
la verdad que no estoy seguro, pero tu codigo igualmente me da sospechas.

primero:  
el while L.Long > 0 está demás. con el L.List <> nil es m'as que suficiente.


tercero:
L.List  := NIL, pero y claro, si no fuera NIL todavia estarias dentro del bucle, al menso que L.Long sea mayor que los elementos que realmente estan en la lista y eso causa error.

cuarto:
?que hace EliminarElemC(Temp^.Elem)? es decir, TelmC es un puntero?
 
Código: Text
  1.  
  2. while(L.List&#60;&#62;nil) do
  3. begin
  4.    temp:=L.List;
  5.     L.List:=L.List^.sig;
  6.     {tal vez no tengas que usar los 2, usa 1 o el otro, o en su defecto los dos}
  7.     EliminarElemC(Temp^.Elem);
  8.     dispose(Temp);
  9.    {es decir, proba usar o dispose o EliminarElemC o los dos.}
  10.   end;
  11.  L.long:=0;
  12.  
  13.  

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #4 en: Viernes 22 de Septiembre de 2006, 22:22 »
0
Si. Todas las cosas de mas las puse yo, pues ya no sabia que inventar para que andara.... De cualquier forma, me refiereo a la que vos me das y la que yo pongo... son equivalentes...

Y el elminarElemC(var E:elemC) es el procedimiento de otro tda que enrealidad no hace mas que E:=0; pues ElemC=interger.... lo puse porque asi es la teoria del tipo de dato abstracto...

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #5 en: Viernes 22 de Septiembre de 2006, 23:02 »
0
Citar
De cualquier forma, me refiereo a la que vos me das y la que yo pongo... son equivalentes...
No no son equivalentes.
Citar
while (L.Long>0) and (L.List<>nil)
esto es un agujero para bugs,  si llegas a tener L mayor a los elementos que tienes, puede causar que dejes elementos sin dispose.

en que momento se produce el error, cuando recien comienza el bucle o al final?

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #6 en: Viernes 22 de Septiembre de 2006, 23:41 »
0
Si queres te dejo el programa para que veas donde sucede el error. Se que va a hacer complicado entenderlo porque como lo unico que me interesa es saber si resuleve el problema, yo no respeto nada, me meto en la implementacion del tdaElem (ya veras...) pero de las listas, no toco nada.

De cualquier forma te respondo: El error me aparace, creo yo, porque el puntero queda en cualquier lado, en: "Dispose(temp)" pero se debe a lo que dije en el primer post, se inserto un elemento sin razon aparente con anterioridad. Ya entenderas todo....

No voy a pedirte que me corrijas todo solo dime (for favor) cual puede ser el error,  no tarda mucho en aparecer.

Que me dices?

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #7 en: Sábado 23 de Septiembre de 2006, 02:57 »
0
y donde dejasta el código? :blink:

que no lo encuentro :P

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #8 en: Lunes 25 de Septiembre de 2006, 21:09 »
0
ups... les dejo el programa entero hasta donde yo hice, no lo termine.
Elijan la opcion 8 posicion en archivo 0, luego la opcion 6 (resolver) despues la pos 1. y listo.
El procedimiento que falla es el Resolver, que se encunetra en el archivo llamado sudoku.

Grax
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #9 en: Martes 26 de Septiembre de 2006, 14:35 »
0
una pregunta:

¿Probaste hacer un programa a parte para probar si te funciona el TDA de la lista?
Es decir, le metes 10 elementos en la lista y luego intentas borrarlos  y vaciar la lista.

Si eso no te resulta, de seguro que está mal la lista.

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #10 en: Martes 26 de Septiembre de 2006, 22:36 »
0
Bueno, el tda lista que incluyo en el archivo para descargar (tdaLista) es el que siempre uso... porloque no tiene ningun error. Si queres podes fijarte... veras que no hace nada del otro mundo...

Ademas, ya ni se... se me estan llendo las ganas de seguir terminando el programa...  :(  yo queria terminarlo; ademas hace poco se me habia ocurrido otra idea que se basaba en suposiciones, para resolver el sudoku, bueno: no se...

toy depre...  :unsure:

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #11 en: Martes 26 de Septiembre de 2006, 22:40 »
0
Ahora que lo pienso, talvez el pascal que yo tengo anda mal... saben de donde puedo bajarme uno que ande completamente bien?

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #12 en: Martes 26 de Septiembre de 2006, 23:29 »
0
Cita de: "Ocean Soul"
Ahora que lo pienso, talvez el pascal que yo tengo anda mal... saben de donde puedo bajarme uno que ande completamente bien?
Supongo que tienes Turbo Pascal 7.... para la época que etamos, es horrible....

una alternativa es el Free Pascal (es mucho mejor, yo nunca lo usé, bua... tomando en cuanta que hace años que no tengo el TP :P)
http://www.freepascal.org/download.html
Además viene con la misma IDE.

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #13 en: Miércoles 27 de Septiembre de 2006, 01:06 »
0
Yo tengo el Free Pascal pero me parece mas horrible que pascal. Talvez vos no sepas: Un dia compile y ejecute un programa (largo) donde una variable, que no me di cuenta, no estaba declarada (era un simple entero). Ademas en el programa del sudoku en free pascal se corta mucho antes. Todo es muy raro... :blink:

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Resolver Sudoku
« Respuesta #14 en: Miércoles 27 de Septiembre de 2006, 01:53 »
0
Cita de: "Ocean Soul"
Yo uso turbo pascal 7 (Tambien intente con free pascal, pero sucede lo mismo). Todo el TDA Lista me lo dieron en la universidad, igual yo lo verifique denuevo, y para mi esta todo bien...

Que problema!

Aca les dejo el codigo de la lista en el procedimiento que me sale el error, quien sabe, talvez si hay un error....
Código: Text
  1.  
  2.          TipoPosicion=Integer;
  3.   PtrLista=^NodoLista;
  4.  
  5.   NodoLista=Record
  6.       Elem:TelemC;
  7.       sig:PtrLista;
  8.       end;
  9.  
  10.   Lista=Record
  11.                     List:PtrLista;
  12.                     Long:Integer;
  13.                     end;
  14.  
  15. Procedure VaciarLista(Var L:lista);
  16. var
  17. temp:ptrLista;
  18. Begin
  19.         while (L.Long&#62;0) and (L.List&#60;&#62;nil) do
  20.   Begin
  21.     temp:=L.List;
  22.     L.List:=L.List^.sig;
  23.     EliminarElemC(Temp^.Elem);
  24.     dec(L.Long);
  25.     dispose(temp);
  26.   end;
  27.   L.long:=0;
  28.   L.List:=NIL;
  29. end;
  30.  
  31.  
Esta parte no me convence... hace que un algoritmo que debería ser simple sea demasiado complicado de seguir: :P  Imagínate lo que pasaría si el algoritmo sería más complicado...

    temp:=L.List;
    L.List:=L.List^.sig;
...
    dec(L.Long);

Además los nombres que le pusistes a los tipos y variables no son buenos, eventualmente poner esos nombres cortos y no muy descriptivos sólo dan dolor de cabeza. :P

Código: Text
  1.  
  2.          TPosicion=Integer;
  3.   PElementoDeLista=^TElementoDeLista;
  4.  
  5.   TElementoDeLista=Record
  6.       DatosDeElemento:TDatosDeElemento;
  7.       SiguienteElemento:PElementoDeLista;
  8.       end;
  9.  
  10.   TLista=Record
  11.                     PrimerElemento:PElementoDeLista;
  12.                     NumeroDeElementos:Integer;
  13.                     end;
  14.  
  15.  

Puede parecer incomodo pero evita dolores de cabeza con los bugs.


Intenta modificando el codigo para que se parezca a esto:
Código: Text
  1.  
  2. actual := L.PrimerElemento;
  3. while actual&#60;&#62;nil
  4. begin
  5.   siguiente := actual.siguiente;
  6. ...
  7.   borrar &#34;actual&#34;
  8. ...
  9.   actual:=siguiente;
  10. end;
  11.  
  12.