Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #33  
Antiguo 01-04-2018
tsk tsk is offline
Miembro
 
Registrado: dic 2017
Posts: 52
Poder: 7
tsk Va por buen camino
Acabo de ver tu video, y el error que te marca es por intentar acceder a una región de memoria inválida, y el error está cuando invocas la función FillByte.

Hice lo siguiente para hacer unas pruebas, y a pesar de compilar, presenta unos errores.

Código:
program Main;

type
    TArrayBool = array[0..0] of boolean;
    PArrayBool = ^TArrayBool;

var 
    Lista : PArrayBool;    
begin
    Getmem(Lista,1 + 10*SizeOf(Boolean));
    writeln(Lista^[0]);
    FillByte(Lista,1+10*SizeOf(Boolean),0);
    writeln(Lista^[1]);
    writeln(Lista^[3]);
    Lista^[3] := TRUE;
    writeln(Lista^[3]);
    writeln(Lista^[10]);
    writeln(Lista^[11]);
    writeln(Lista^[12]);
    writeln(Lista^[13]);
    FreeMem(Lista,1 + 10*SizeOf(Boolean));
    writeln('Test');
end.
Código:
 fpc main.pas
Free Pascal Compiler version 3.0.0 [2015/12/05] for x86_64
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling main.pas
main.pas(13,20) Warning: range check error while evaluating constants (1 must be between 0 and 0)
main.pas(14,20) Warning: range check error while evaluating constants (3 must be between 0 and 0)
main.pas(15,12) Warning: range check error while evaluating constants (3 must be between 0 and 0)
main.pas(16,20) Warning: range check error while evaluating constants (3 must be between 0 and 0)
main.pas(17,20) Warning: range check error while evaluating constants (10 must be between 0 and 0)
main.pas(18,20) Warning: range check error while evaluating constants (11 must be between 0 and 0)
main.pas(19,20) Warning: range check error while evaluating constants (12 must be between 0 and 0)
main.pas(20,20) Warning: range check error while evaluating constants (13 must be between 0 and 0)
Linking main
/usr/bin/ld: aviso: link.res contiene secciones de salida. ¿Olvidó -T?
23 lines compiled, 0.4 sec
8 warning(s) issued
Si lo ejecuto, obtengo el mismo error que tu, al invocar la función FillByte

Código:
$ ./main
TRUE
Runtime error 216 at $0000000000400252
  $0000000000400252
  $000000000040018F
Pero si lo comentamos y compilamos de nuevo, no se observa el error, pero lo que no me cuadra el es hecho que se puede acceder a regiones de memoria que no se encuentran dentro de los límites que se especificaron en GetMem

Código:
$ ./main
TRUE
FALSE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
Test
Le hice algunos cambios, también debes notar que hay dos funciones, GetMem y Getmem. GetMem es una función que retorna un puntero hacia el espacio de memoria reservado y lo puedes ver en el siguiente código como Lista := GetMem(....). Y Getmem funciona como el GetMem del Delphi.

También puedes observar que en FillByte cambién FillByte(Lista,1+10*SizeOf(Boolean),0) por FillByte(Lista^,1+10*SizeOf(Boolean),0), es ahí donde te marcaba el error 216.

Código:
program Main;

type
    TArrayBool = array[0..0] of boolean;
    PArrayBool = ^TArrayBool;

var 
    Lista : PArrayBool;    
begin
    //Lista := GetMem(1 + 10*SizeOf(Boolean));
    Getmem(Lista,1 + 10*SizeOf(Boolean));
    writeln(Lista^[0]);
    writeln(Lista^[1]);
    writeln(Lista^[2]);
    FillByte(Lista^,1+10*SizeOf(Boolean),0);
    writeln(Lista^[0]);
    writeln(Lista^[1]);
    writeln(Lista^[2]);
    writeln(Lista^[10]);
    writeln(Lista^[11]);
    writeln(Lista^[12]);
    writeln(Lista^[13]);
    FreeMem(Lista,1 + 10*SizeOf(Boolean));
    writeln('Test');
end.
Salida
Código:
$ ./main
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
Test
Como vez, puso todo a 0, y para comprobar que sólo se inicializan los valores correspondientes, modifico FillByte de 0 a 1

Código:
program Main;

type
    TArrayBool = array[0..0] of boolean;
    PArrayBool = ^TArrayBool;

var 
    Lista : PArrayBool;    
begin
    //Lista := GetMem(1 + 10*SizeOf(Boolean));
    Getmem(Lista,1 + 10*SizeOf(Boolean));
    writeln(Lista^[0]);
    writeln(Lista^[1]);
    writeln(Lista^[2]);
    FillByte(Lista^,1+10*SizeOf(Boolean),1);
    writeln(Lista^[0]);
    writeln(Lista^[1]);
    writeln(Lista^[2]);
    writeln(Lista^[10]);
    writeln(Lista^[11]);
    writeln(Lista^[12]);
    writeln(Lista^[13]);
    FreeMem(Lista,1 + 10*SizeOf(Boolean));
    writeln('Test');
end.
Salida

Código:
$ ./main
TRUE
TRUE
TRUE
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
Test
Responder Con Cita
 



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
Meetup #3 - Migrar Un componente de Lazarus a Delphi Starter egostar La Taberna 1 20-07-2017 23:11:17
problemas al migrar aplicacion lazarus windows a lazarus linux anubis Linux 5 08-11-2016 15:41:58
Migrar Aplicacion Lazarus De Ubuntu A Windows volv87 Lazarus, FreePascal, Kylix, etc. 4 26-07-2007 08:03:07
Migrar aplicacion Delphi triskel Windows 1 10-05-2005 13:26:04
migrar una aplicacion alfgonvar Varios 2 04-07-2003 18:15:24


La franja horaria es GMT +2. Ahora son las 06:08:31.


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