Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-03-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
Error Exception EAccessViolation

Saludos colegas, denuevo vuelvo con un error xDD parece que les caigo bien y siempre me aparecen.
Ando usando Delphi 7 y tengo Windows 8.1 de 64 bits.
Ando creando un juego como veran a continuacion y tiene el siguiente codigo.


Código Delphi [-]
program PJuego;

uses
  Windows,
  Dialogs,
  SysUtils,
  UJuego in 'UJuego.pas',
  UArcade in 'UArcade.pas';


{$R *.res}
var
Teclado : TTeclado;
Temporizador : TTemporizador;


begin
  InicializarSDL;
  ModoVideo( 640, 480, 16, True );
  Teclado := TTeclado.Create;
  Temporizador := TTemporizador.Create;
  CargarSprites;

  while not bSalir do
  begin
    Temporizador.Actualizar;

    if Temporizador.Activado then
    begin
      Teclado.Leer;
      DibujarSprites;
      ActualizarPantalla;
      Temporizador.Incrementar;
      ControlarEventos;
    end
    else
      Temporizador.Esperar;
  end;

  DestruirSprites;
  Temporizador.Free;
  Teclado.Free;
  FinalizarSDL;
end.

Al ejecutarlo me da el error Exception EACcessViolation in module... at 000527CB. Access violation ant address 004527CB.... Read of address 000000006.El problema me da cuando escribo la linea del procedure
Código Delphi [-]
ControlarEventos;
que se encuentra en la unidad UArcade.pas el programa me corre sin esta pero ya saben.. no hara el proceso xD.

He indagado en internet y segun entendi cuando el address tiene 00000 es que el proceso al que intento llamar no ha sido creado o ya ha sido destruido. Pero reviso en el codigo y a mi parecer no le veo el error. Descargue madExcept que dicen que es un buen rastreador de excepciones y que las maneja pero no encuentro alguna guia para instalarlo en Delphi, aunque como es la version mas reciente se instala ''automaticamente'', o en mi caso no funciona. Por favor quisiera un poco de su sabiduria una vez mas!!
Responder Con Cita
  #2  
Antiguo 23-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Vale, pero cómo te ayudamos si no vemos ControlarEventos?
Responder Con Cita
  #3  
Antiguo 23-03-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
Perdon estaba pensando en ponerlo xDD

Código Delphi [-]
procedure ControlarEventos;
begin
if Teclado.bDerecha and (Heroe.x < 545 ) then
Inc( Heroe.x);

if Teclado.bIzquierda and ( Heroe.x > 0 ) then
Dec(Heroe.x);

if Teclado.bArriba and ( Heroe.y > 0) then
Dec(Heroe.y);

if Teclado.bAbajo and ( Heroe.y < 407 ) then
Inc (Heroe.y);

end;

Igual que en todo el programa la variable Teclado es de tipo TTeclado que viene siendo una class creada!!
Responder Con Cita
  #4  
Antiguo 23-03-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
Saludos colega,

Y Heroe, ¿también?

Le podría hacer seguimiento paso a paso con el depurador de Delphi, para verificar qué parte del código de ControlarEventos tiene valor nil.

-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #5  
Antiguo 23-03-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
Heroe es de tipo TSprite una clase tambien creada, de verdad que no se mucho del tema de trackear y reparar este tipo de errores si me pudiera sugerir algunos links del foro o de algun lugar para aprender mas sobre este topico me vendria bien
Responder Con Cita
  #6  
Antiguo 23-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Depura tu programa, las excepciones Access Violation son siempre porque estas intentando trabajar con un objeto que no fue creado

Pon un punto de ruptura (breakpoint) y corre el programa con F9

Revisa la documentacion relacionada con depurar

En esta imagen se ve como colocar un breakpoint:

Setting and Modifying Breakpoints



Los puntos a la izquierda del codigo, son los puntos de ruptura. Si esta en azul significa que en ese lugar podes colocar un punto de ruptura. Si esta en rojo significa que cuando ejecutes con el depurador (F9) cuando se llege a esa instruccion el codigo se detiene y te permite ver el estado de las variables, los objetos, etc

Una llegado a ese punto, tenes varias acciones mas para continuar la depuracion. Por ejemplo con F8 pasas a la siguiente linea ("avanzar"); con F9 vas hasta el proximo punto de ruptura (si no hay ninguno, entonces el programa sigue como si nada)

Podes poner puntos de ruptura una vez el programa ya esta en ejecucion y siendo depurado. Siempre que el flujo del programa llegue a ese punto, el IDE se pondra en primer plano

Revisa esto How To Use the Debugger
Responder Con Cita
  #7  
Antiguo 23-03-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
Segui el consejo de AgustinOrtu e indague sobre el tema del debugger pero termine muy confundido xDD
Perooo leyendo entendi osea el proceso ControlarEventos; deberia activarse al presionar una tecla debido a que dependiendo la tecla que sea produce una accion (en este caso moveria el Sprite que cargue) para eso tengo el procedure Leer; en la clase TTeclado que me lee algun evento del teclado.

Código Delphi [-]
procedure TTeclado.Leer;
begin
  // ¿Se ha producido un evento?
  if SDL_PollEvent( @Evento ) > 0 then

  begin
    // ¿Ha pulsado una tecla?
    if Evento.type_ = SDL_KEYDOWN then
    begin
      x := True; //Introducido recientemente
      iUltTec := Evento.key.keysym.sym;

      case Evento.key.keysym.sym of
        SDLK_ESCAPE: bSalir := True;
        SDLK_RIGHT: bDerecha := True;
        SDLK_LEFT: bIzquierda := True;
        SDLK_UP: bArriba := True;
        SDLK_DOWN: bAbajo := True;
        SDLK_SPACE: bEspacio := True;
        SDLK_RETURN: bIntro := True;
        SDLK_LCTRL: bCtrl_Izq := True;
      end;
    end;

    // ¿Ha levantado una tecla?
    if Evento.type_ = SDL_KEYUP then
    begin
      iUltTec := 0;

      case Evento.key.keysym.sym of
        SDLK_RIGHT: bDerecha := False;
        SDLK_LEFT: bIzquierda := False;
        SDLK_UP: bArriba := False;
        SDLK_DOWN: bAbajo := False;
        SDLK_SPACE: bEspacio := False;
        SDLK_RETURN: bIntro := False;
        SDLK_LCTRL: bCtrl_Izq := False;
      end;
    end;
  end;
  x := False;  //Introducido recientemente
end;

Lo que dice "Introducido recientemente" lo puse asi para que en el bucle principal del programa si se cumple la condicion:

Código Delphi [-]
Temporizador.Incrementar;
      if x = True then
      ControlarEventos;

me ejecute el procedure ControlarEventos; y no cada 25 mls(Debido a que es un juego tiene que tener un tiempo de reaccion rapido no? Por lo cual cada 25 mls el Temporizador se actualiza) ahora cuando lo ejecuto no da error pero no hace nada en el procedure ControlarEventos; y comprobe si se cumplia la condicion y en efecto puse ShowMessage() debajo de cada Introduccido recientemente y al momento de ejecuccion me devolvia los valores asignados, deberas perdon por insistir tanto pero alguna idea de como resolver este meollo ??
Responder Con Cita
  #8  
Antiguo 23-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Y por qué pones X a False? De esa manera nunca vas a entrar en ControlarEventos

El problema no ocurre en TTeclado.Leer, ocurre en ControlarEventos

Debes revisar si esta creado el objeto Heroe

Quien es Heroe? Que es Heroe? Quien lo crea? Como conoce el metodo ControlarEventos a Heroe?
Responder Con Cita
  #9  
Antiguo 23-03-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
Puse x := False para comprobar que si funcionaba el bucle!! Y sip el objeto Heroe esta creado ya que digamos los eventos DibujarSprites, CargarSprites,DestruirSprites y ControlarEventos; se encuentran en la misma unidad (Otra que no es donde esta el programa principal en si) y funcionan, es decir, a la hora de ejecutar el programa si aparece el Sprite dibujado en el programa y cuando presiona la tecla Escape sale el programa!!.

"Quien es Heroe? Que es Heroe? Quien lo crea? Como conoce el metodo ControlarEventos a Heroe?"

Heroe viene siendo un objeto del tipo TSprite, es decir, el personaje en el videojuego!! Lo crea otro proceso llamado CargarSprites igual que el Fondo que tambien lo crea al ejecutar el programa, si quieres paso la clase TSprite tambien si les parece mejor!!
Responder Con Cita
  #10  
Antiguo 23-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Vas a tener que pone el código fuente, no somos adivinos
Responder Con Cita
  #11  
Antiguo 23-03-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
a.a mejor os dejo el proyecto entero !! Incluye un .txt con la pagina de tutorial de donde estoy creando el juego.

https://drive.google.com/file/d/0B4F...ew?usp=sharing
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error EAccessViolation !? ManelC Varios 9 05-07-2008 21:58:42
Exeception EAccessViolation error thelibmx Varios 0 02-07-2007 17:48:59
Error EAccessViolation chele Firebird e Interbase 0 09-11-2004 16:51:21
Error EAccessViolation.... JorgeBec Conexión con bases de datos 5 18-02-2004 22:34:11
Error de exception jgutti Varios 1 20-11-2003 02:03:15


La franja horaria es GMT +2. Ahora son las 23:58:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi