Programación General > Pascal

 Resolver Sudoku

(1/3) > >>

Ocean Soul:
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:
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:
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 ---          TipoPosicion=Integer;  PtrLista=^NodoLista;   NodoLista=Record      Elem:TelemC;      sig:PtrLista;      end;   Lista=Record                    List:PtrLista;                    Long:Integer;                    end; Procedure VaciarLista(Var L:lista);vartemp:ptrLista;Begin        while (L.Long>0) and (L.List<>nil) do  Begin    temp:=L.List;    L.List:=L.List^.sig;    EliminarElemC(Temp^.Elem);    dec(L.Long);    dispose(temp);  end;  L.long:=0;  L.List:=NIL;end;  

Enko:
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 --- while(L.List&#60;&#62;nil) dobegin   temp:=L.List;    L.List:=L.List^.sig;    {tal vez no tengas que usar los 2, usa 1 o el otro, o en su defecto los dos}    EliminarElemC(Temp^.Elem);    dispose(Temp);   {es decir, proba usar o dispose o EliminarElemC o los dos.}   end; L.long:=0;  

Ocean Soul:
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...

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa