Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   migrar aplicacion delplhi - lazarus (https://www.clubdelphi.com/foros/showthread.php?t=92928)

danielmj 15-03-2018 21:05:07

migrar aplicacion delplhi - lazarus
 
Hola de nuevo a todos, hace tiempo que no ando por aqui, pero estoy teniendo problemas con un pequeño programa que hice en su dia para delphi y que ahora estoy llevando a linux mediante lazarus. Todo está bien en modo compilacion, pero al pulsar F9, tira el error que veis en la captura. No sé por que habla de esa propiedad "flatscrollbar" si el componente (listview) no la tiene.

https://drive.google.com/open?id=12Y...yhce3MB2fJLA85

Alguna idea o sugerencia?
Saludos.

Casimiro Notevi 15-03-2018 21:26:29

¿Seguro que es un listview?

danielmj 15-03-2018 22:08:56

Hola casimiro, si estoy seguro.
https://drive.google.com/open?id=1Te...wNt1zfJIqwugT0

Saludos.

TiammatMX 15-03-2018 22:52:27

Cita:

Empezado por danielmj (Mensaje 525125)
... No sé por que habla de esa propiedad "flatscrollbar" si el componente (listview) no la tiene...

No, no la tiene 'per sé', es heredada del ancestro del TListView, es la propiedad que si rebasa límites derecha-abajo, pone las barras de navegación. Busca la propiedad en el propio componente, cambia su valor y con eso debe ser suficiente.

danielmj 16-03-2018 14:11:54

Hola TiammatMX,

La unica propiedad que se me ocurre cambiar es poner o no las scrollbar, he probado a quitarlas y/o modificarlas pero sigue sin correr.
Un saludo.

Casimiro Notevi 16-03-2018 18:02:51

Por decir algo, puede que antes tuvieses instalada otra versión que sí tenía esa propiedad y se está usando su bpl.

danielmj 17-03-2018 11:14:23

bueno, la aplicacion se hizo originariamente con delphi 7, no fue por ejemplo de lazarus para windows -> lazarus para linux, no no. Ha sido de D7 a lazarus linux y me encuentro con eso.
Un saludo.

ASAPLTDA 18-03-2018 22:16:48

Propiedad
 
Me ha pasado que la propiedad queda en el texto del componente, revisa la forma como texto, busca el componente y chequea las propiedades

danielmj 19-03-2018 17:38:01

Hola asapltda no entiendo muy bien lo que dices, en el inspector de objetos no hay ninguna propiedad flatscrollbars, y buscando encontre en http://lazarus-ccr.sourceforge.net/d...mlistview.html que esa propiedad tiene un valor por defecto de 0 (falso). Así que en form.create he puesto:
Código Delphi [-]
lista.flatscrollbars:= false
pero sigue igual con el mismo error.

Ñuño Martínez 19-03-2018 17:45:27

El problema es que esa propiedad no existe en el widgetset que estés usando (o en la LCL). Borra la línea y debería funcionar (también en el archivo que contiene el diseño de la ventana).

Casimiro Notevi 19-03-2018 19:00:38

O elimina el componente y lo vuelves a crear.

danielmj 20-03-2018 15:54:17

Hola buenas, lo que dices Casimiro ya lo probé y nada. Estoy pensando en usar una base de datos para almacenar esos valores pero supone modificar gran parte del codigo. Saludos.

Casimiro Notevi 20-03-2018 19:18:18

¿Has probado lo que te han comentado los otros compañeros?
Abres el Form en modo texto, buscas la palabra flatscrollbar y borras la línea.
Vuelves a ponerlo en modo Form.

danielmj 21-03-2018 20:55:46

Hola buenas, ya hice lo de editar como texto y el error se daba en varios componentes pero de este modo se ha solucionado, ahora da ciertos errores pero en compilacion (errores de programacion) que estoy mirando. Gracias por la ayuda.

danielmj 22-03-2018 10:54:47

Buenos dias, al final tanto trabajo para nada, he estado usando el programa generando 100.000 combinaciones y comparando cada una de esas combinaciones con cada una de las 720 permutaciones y en un momento determinado el ordenador se reinicia por calentamiendo excesivo (supongo) y eso que tengo refrigeración liquida que siempre enfria mas que simples ventiladores. Así que me olvido de esto por que estadisticamente las probabilidades de encontrar una combinación ganadora decrecen de forma proporcional en función del número de combinaciones generadas. Es decir, no es lo mismo buscar una combinación de 6 entre (1000) con 720 permutaciones que una entre 10.000.000 con 720 permutaciones. Así que... no puede ser.

Un saludo.

Casimiro Notevi 22-03-2018 12:00:55

je, je, je... hubo una época (yo tenía pelo) en la que varios amigos nos asociamos y montamos un equipo para lo que estás haciendo (basado en procesadores Motorola 68xxx y varios coprocesadores matemáticos externos). Una vez ejecutado, el programa tardaba varias semanas en obtener el resultado, que se iba almacenando en un fichero de texto. Después ese resultado lo filtrábamos mediante otro programa para eliminar basura, repetidos, los que seguro no iban a salir, etc. y quedaban finalmente unas 4000 combinaciones.
El sistema operativo era Minix (todavía no existía Linux), y lo tecleamos por completo, compilamos, linkamos... para obtener el ejecutable.
Y nuestro programa estaba escrito en lenguaje C, puro y duro.

danielmj 22-03-2018 12:44:59

Hola casimiro, pues estoy pensando en una forma para aligerar el proceso y ver si funciona, en concreto.. la aplicacion calcula por ejemplo 20.000 combinaciones de esas, me devuelve los 6 numeros que mas se repiten y a partir de ahí calcula las permutaciones que luego irá comparando con cada combinacion de 6 numeros del listview pero ahora estoy pensando en comparar cada uno de esos 6 numeros con el primero de cada fila del listview, si es igual completa el proceso de comparaciones sino, salta a la siguiente linea (como tienen que darse si o si los 6...). Al menos así creo que el tiempo puede reducirse algo. También estoy pensando en descargar los listados que estan disponibles de los sorteos ya jugados y agregarlos al listview y realizar todo el proceso con esos datos en lugar de generar 6 numeros aleatorios. Imaginacion al poder :D

Un saludo.

tsk 22-03-2018 16:19:29

No tienes que calcular todas las combinaciones, toma todos los datos publicados de resultados anteriores y verifica si hay algún patrón que te permita reducir el área de búsqueda.

Y en lugar de analizar combinaciones, analiza posición por posición.

Por ejemplo la ley del primer dígito (Ley de Benford), si se aplica, entonces ya tienes ganada la primera parte.

Si ya tienes el primer dígito, entonces puedes ir reduciendo la probabilidad que el número se repita, y así sucesivamente. Claro, dependiendo de la configuración del sorteo.

Por ejemplo, si es por medio de bolas, puedes suponer que cuando sale un número este no se repone, por lo que si en un inicia hay 10 bolas de cada número (1-9), la probabilidad de que vuelva a salir se reduce, si se reponen cambia la dinámica. ¿Que otras cosas podrían afectar en este modelo? La presión y flujo del aire, tamaño de la esfera que los contiene, su material (de ello depende el rebote) y tamaño de las bolas así como su posición inicial, pero tendrías que ver si te conviene meterlos en la ecuación. Una forma de simular la trayectoria de una esfera usando Random Walks.

Cuando tienes todos los datos de sorteos anteriores puedes ir realizando simulaciones que te permitan reducir los parámetros y calcular un rango de valores para cada uno.

Casimiro Notevi 22-03-2018 18:42:57

Nuestro "experimento" fue hecho mediante fractales.
Luego, con ese resultado, se le pasaba el filtro de combinaciones que ya habían salido, eliminar resultados "imposibles", etc.

danielmj 23-03-2018 19:46:19

Hola tsk, voy a investigar un poco sobre la ley de benford y como aplicarlo al programa. También quiero cargar listados csv de sorteos ya jugados y continuar a partir de ahí, pero no sé muy bien como cargar estos archivos a un listview (este componente siempre ha sido un poco hueso para mi). Buscaré casos en el foro a ver si encuentro algo.

Saludos.

Casimiro Notevi 23-03-2018 20:59:01

Cita:

Empezado por danielmj (Mensaje 525242)
, pero no sé muy bien como cargar estos archivos a un listview (este componente siempre ha sido un poco hueso para mi).

No uses listview, ¿acaso necesitas ver esas combinaciones por pantalla?
Ocupa mucha memoria, hace al programa muy lento y... es innecesario.

danielmj 24-03-2018 01:47:57

Hola casimiro, ahora mismo estoy liado con el programa.. estoy cargando archivos CVS descargados de todos los sorteos desde el 85 y claro, al no ser miles y miles de combinaciones como hacia antes, el programa acaba muy rapido. Lo que me mosquea es que 2 progressbar no avanzan según se lee del listview sino que de repente están llenos, pero claro tambien es verdad que estoy con muchas menos combinaciones que antes.
Quiero mirar como funciona la ley del primer número por una parte y como cargar todos los archivos CSV de la carpeta a la vez, porque se hace tedioso ir cargando 1 a 1.
En cuanto al uso o no del listview, estoy haciendo uso de un listview virtual, aunque si es cierto que sobre otro "dibujado" se cargan los archivos. Igual estoy haciendo algo mal.

Saludos.

yusnerqui 24-03-2018 14:20:21

Mira este enlace http://www.clubdelphi.com/foros/show...chivos+carpeta para lo de leer varios ficheros de una carpeta y para refrescar los progresbar prueba con

Código Delphi [-]
 Application.ProcessMessages


después de cada iteración del ciclo.


saludos

tsk 24-03-2018 17:50:19

Cita:

Empezado por danielmj (Mensaje 525249)
Hola casimiro, ahora mismo estoy liado con el programa.. estoy cargando archivos CVS descargados de todos los sorteos desde el 85 y claro, al no ser miles y miles de combinaciones como hacia antes, el programa acaba muy rapido. Lo que me mosquea es que 2 progressbar no avanzan según se lee del listview sino que de repente están llenos, pero claro tambien es verdad que estoy con muchas menos combinaciones que antes.
Quiero mirar como funciona la ley del primer número por una parte y como cargar todos los archivos CSV de la carpeta a la vez, porque se hace tedioso ir cargando 1 a 1.
En cuanto al uso o no del listview, estoy haciendo uso de un listview virtual, aunque si es cierto que sobre otro "dibujado" se cargan los archivos. Igual estoy haciendo algo mal.

Saludos.

La ley del primer dígito es eso, agarras el primer dígito de todos los números (sin contar los 0 a la izquierda) y obtienes su distribución, esta debe debe de ser algo así



En un mundo aletorio ideal, al generar una secuencia aleatoria, tu no serías capaz obtener información de la secuencia ya que idealmente esta presenta una distribución uniforme, por lo que la aparición de un número es equiprobable a la aparición de cualquier otro, entonces no puedes inferir absolutamente nada.

También existe el supuesto que cada evento es independiente.

Lo que esperarías ver en una lista de números generados de forma aleatoria es es una distribución uniforme.

Pero no todo es siempre así, por ejemplo el siguiente histograma lo obtuve de un generador de números aleatorios por hardware, que se encuentra dentro de un microcontrolador stm32f103c8t6.



A este hardware se le conoce como TRNG (True Random Number Generator) y genera enteros de 32 bits que pueden ir de 0 a 2**32. No es ideal pero es casi ideal, ya que como puedes observar hay rangos que tienen una ligera probabilidad mayor de aparecer, pero no es suficiente para poder predecir cual va a ser el siguiente número en aparecer.

La idea de usar la ley del primer dígito sobre resultados pasados, es sólo para obtener algo más de información del sistema, algo que te permita reducir el espacio de búsqueda.

Por ejemplo, voy a suponer que son los 6 dígitos, pero que cada dígito sólo puede tener el valor de 1 a 9. Entonces la probabilidad de que el primer dígito sea un 1 es igual a 1/9 o aproximadamente el 11.11%, pero si de los datos de sorteos anteriores muetran que sigue la ley del primer dígito, entonces la probabilidad de que tenga un 1 como primer dígito aumenta a un ~30%.

También lo que tienes que preguntarte es si realmente hay independencia en la generación de los dígitos, porque eso te puede dar algo más de información. Si son independientes, no puedes obtener información, ya que aunque tengas la información de que dígito obtuviste primero, no te incrementa la probabilidad de conocer el valor del segundo dígito y así sucesivamente.

p(d2=2|d1=1) = p(d1=2)*p(d1=1)

Si son independientes la igualdad de arriba se debe de cumplir, si no se cumple, entonces ya tienes información extra en la forma de probabilidad de obtener un 2 en dígito 2 dado que dígito 1 ya fue 1.

p(d2=2|d1=1) != p(d1=2)*p(d1=1)

Si detectas, por medio del estudio de datos anteriores, que tienes un proceso que no es del todo aleatorio, y que hay cierta tendencia, entonces a simular se ha dicho para tratar de ajustar un modelo para el sistema.

Un libro muy bueno con respecto a esto es el de Probabilistic Graphical Models: Principles and Techniques de Daphne Koller y Nir Friedman.

Por eso mi ejemplo de la generación de los dígitos por medio de esferas que se encuentra en un recipiente. La posición inicial de cada esfera va a determinar la probabilidad de que salga o no del contenedor, pero también le afecta el choque con otras esferas, al igual que el choque con el recipiente.

Otro aspecto, es que aunque en apariencia todavía puede ser algo aleatorio, es sabido que la suma de variables aleatorias independientes con distribución uniforme, te da una distribución conocida como Irwin-Hall,tu tienes 6 variables aleatorias, que tentativamente son independientes.

danielmj 26-03-2018 11:47:28

Hola tsk, gracias y ahora con toda humildad te digo.. que no entendí nada, esto es lo suficiente complejo como para dedicarle tiempo de estudio, así que al menos usaré toda esta información para investigar.

Saludos yusnerqui, intento implementar el código para mi caso concreto de cargar varios .csv a la vez en un listview pero no lo consigo.. sigo investigando.

yusnerqui 26-03-2018 13:36:50

Cita:

Saludos yusnerqui, intento implementar el código para mi caso concreto de cargar varios .csv a la vez en un listview pero no lo consigo.. sigo investigando.
Pues ya nos dirás que no entiendes o que error te salta para que podamos ayudarte.

saludos

danielmj 27-03-2018 10:40:28

Buenos dias, lo de cargar archivos manualmente o todos en lote, creo que no es relevante (tal como yo lo veo) y lo digo por que los listados de sorteos anteriores, que he encontrado en la web en formato csv vienen tal que así:

27/3/2018 10:36
**************************************************************
***---- ARCHIVO GENERADO EN WWW.LaWebdelaPrimitiva.com ----***
**************************************************************
HISTORICO DE SORTEOS DE La Primitiva DE 2018

FECHA N1 N2 N3 N4 N5 N6 C R Joker Pares/Impares Decenas Bajos/Altos
24-03-2018 17 18 21 23 27 48 6 2 5736038 (2/4) '02301' (4/2)
22-03-2018 1 7 24 34 36 48 29 8 2271456 (4/2) '20121' (3/3)
17-03-2018 8 21 35 36 37 43 39 1 4497057 (2/4) '10131' (2/4)
15-03-2018 5 9 11 20 22 29 33 0 3794358 (2/4) '21300' (5/1)
10-03-2018 4 18 20 25 30 49 16 0 6041319 (4/2) '11211' (4/2)
8-03-2018 2 9 12 15 26 31 16 0 5986378 (3/3) '22110' (4/2)
3-03-2018 5 14 24 28 36 49 21 7 4052156 (4/2) '11211' (3/3)
1-03-2018 6 9 17 22 28 36 7 1 8185066 (4/2) '21210' (4/2)
24-02-2018 4 5 12 27 43 45 40 7 3544370 (2/4) '21102' (3/3)
22-02-2018 4 8 11 23 34 35 2 2 6822466 (3/3) '21120' (4/2)
17-02-2018 9 18 19 22 31 38 17 8 8034825 (3/3) '12120' (4/2)
15-02-2018 1 2 21 22 27 47 24 0 4085600 (2/4) '20301' (4/2)
10-02-2018 7 10 12 19 22 45 2 3 9104800 (3/3) '13101' (5/1)
8-02-2018 12 18 19 24 32 42 30 7 7355415 (5/1) '03111' (4/2)
3-02-2018 1 9 11 26 33 40 27 2 6229581 (2/4) '21111' (3/3)
1-02-2018 1 4 38 42 46 49 35 2 5778491 (4/2) '20013' (2/4)
27-01-2018 7 8 10 14 27 48 42 7 3129415 (4/2) '22101' (4/2)
25-01-2018 3 6 25 31 32 40 20 6 8889779 (3/3) '20121' (3/3)
20-01-2018 15 23 28 36 39 47 29 8 3031690 (2/4) '01221' (2/4)
18-01-2018 11 12 22 28 37 49 24 0 3973025 (3/3) '02211' (3/3)
13-01-2018 6 7 22 31 38 44 40 8 5053 (4/2) '20121' (3/3)
11-01-2018 15 24 29 32 36 46 44 0 4807239 (4/2) '01221' (2/4)
6-01-2018 19 28 33 40 42 48 38 0 263047 (4/2) '01113' (1/5)
4-01-2018 6 9 13 24 35 42 16 3 5207129 (3/3) '21111' (4/2)

Y al final tendre que editarlos para quedarme solo con las columnas referentes a los 6 números despreciando el resto, por lo que según lo veo, cargarlos por lote no me sirve. Lo que si hice fue abrilos todos con libreoffice y formar un solo archivo con todos los sorteos, ese es el único fichero que le paso al programa. En cuanto al otro tema (ley del primer dígito, sigo en ello)

Casimiro Notevi 27-03-2018 11:48:36

Cita:

Empezado por danielmj (Mensaje 525319)
Y al final tendre que editarlos para quedarme solo con las columnas referentes a los 6 números despreciando el resto, por lo que según lo veo, cargarlos por lote no me sirve. Lo que si hice fue abrilos todos con libreoffice y formar un solo archivo con todos los sorteos, ese es el único fichero que le paso al programa. En cuanto al otro tema (ley del primer dígito, sigo en ello)

Es una solución.

La otra solución es cambiar de la primitiva a la bonoloto :D porque el fichero csv es así:

Código:

FECHA,COMB. GANADORA,,,,,,COMP.
4/05/2017,5,7,10,23,36,41,22
3/05/2017,13,25,27,33,34,38,19
2/05/2017,2,17,25,27,35,43,37
1/05/2017,9,12,15,19,38,46,4
29/04/2017,10,19,22,24,43,44,23
28/04/2017,5,9,15,17,21,47,20
27/04/2017,11,40,42,45,46,49,27
26/04/2017,12,14,20,34,39,40,27
25/04/2017,5,9,12,13,39,41,45
24/04/2017,16,22,25,31,38,48,46
22/04/2017,12,35,37,41,47,48,17
21/04/2017,2,5,9,16,37,40,10


tsk 27-03-2018 19:56:26

Realizando un análisis rápido de los números que han salido, sin tomar en cuenta su posición, observamos que existe una tendencia a que el primer dígito esté distribuido más o menos equitativamente entre los primeros 4 dígitos (1-4) Esto se explica porque los números van del 1 al 49, pero aun así no se ve que siga la gráfica de la distribución del primer dígito.



Pero no todo está perdido, ya que aun así puedes obtener otro tipo de información, por ejemplo, si observas en la siguiente gráfica, se ve que al menos, la gráfica se parece entre 2015 y 2016 y entre 2017 y 2018 está tomando la misma forma.



Con respecto a la lista de números que han aparecido de 2015-2018 vemos



Me imagino que si tomo lo totalidad de los sorteos, esto debería tender a formar una distribución uniforme.

¿Porqué vemos esa disminución que existe entre los 20-25?



Porque desde el 2015, que tomé los datos, no ha aparecido el número 25



Pero si también observas, en cada año siempre hay un número que supera, por muy poco las 20 apariciones, y también son pocos los que alcanzan a superar los 15 apariciones

Por ejemplo

2015 > 20 -> 30
2016 > 20 -> 40
2017 > 20 -> 3
2018 > 20 -> No hay suficientes datos pero los que llevan la delantera son los números 9, 22 y 36.

2015 > 15 <=20 -> 1,11,20,38,46,49 (1-2 , 2-1, 3-1, 4-2)
2016 > 15 <=20 -> 6,11,12,14,21,46 (1-3, 2-1, 4-1, 6-1 )
Si observas las gráficas verás que en esos años, los números que se destacaron ligeramente más, fueron los que tenían como primer dígito el 1 y el 4.

2017 > 15 <=20 -> 20,22,26,28,29,35,48 (2-5,3,1,4-1)
2018 > 15 <=20 -> No hay suficientes datos, pero voy a tomar los que ya llegaron a 4 y 5 apariciones 1,4,6,7,11,12,18,19,24,28,29,32,42,48,49

Si observas las gráficas, en 2017 los números que tuvieron como primer digito el 2 fueron los que destacaron, siguiendo el 3 y el 4, así que si sigue la misma tendencia, los números que más van a aparecer en el 2018 son del 20 al 29.

Existen programas que te permiten explorar los datos, uno de ellos es R que junto con R-Studio, te permite realizar un análisis más complejo. Para las gráficas de arriba use python+matplotlib.

Cabe aclarar que ya se entró al mundo de la especulación, ya que no se tomó la totalidad de los resultados,es decir, los de antes de 2015 y el objetivo de esto fue tan sólo para explorar los datos, obtener cierta información y determinar que otras pruebas se podrían hacer para ver si existe algún otro tipo de patrón, como por ejemplo, no se estudió el orden de aparición de los números y tampoco se estudió el segundo dígito. Tampoco se estudió las secuencias ganadoras, para ver su relación con los números que más aparecen, entre otras cosas, tan sólo fue algo exploratorio que inicialmente permite ver ciertos comportamientos y permite extraer cierta información que puede ser útil a la hora de plantear otros métodos para obtener una mejor idea de lo que ocurre.

Saludos.

danielmj 30-03-2018 18:03:03

Hola tsk, gracias por toda la información, estoy en ello.
Como dije en un principio, la migracion era de win->linux y unas de las unidades que se usa (para general los números aleatorios) es uTAlea.pas, he tenido que convertirla a lazarus para que sepa interpretarla ya que el archivo original para windows seguía una sintaxis que era desconocida para lazarus. En concreto:

sistaxis delphi
Código Delphi [-]
ZeroMemory(Lista,1+Maximo * SizeOf(Boolean));
(uTAlea.pas original)

sistaxis lazarus
Código Delphi [-]
FillByte(Lista,1+Maximo,65000);

Buscando en la red encontre la equivalencia delphi->lazarus
http://forum.lazarus.freepascal.org/...html#msg105499

Como puede verse, son ligeramente diferentes, en lazarus sino me equivoco no existe la instrucción "zeromemory" en su lugar se usa FillByte, y aunque en tiempo de compilación no da error, si lo da en cuanto pulso el boton que tiene ese código asociado como puede verse en la captura. Por otra parte, el valor de 65000 es arbitrario, lo he puesto sin saber muy bien que valor poner (antes tenia 4096)y seguía con el mismo error, por lo que no sé que valor poner ahí para que no de error.

Creo que es esa linea la que tira la aplicacion, pero no estoy seguro..
https://drive.google.com/open?id=1La...0NhGHaGGoXWL6z

Alguna idea? Saludos.

tsk 30-03-2018 20:17:41

Esta es la definición del procedimiento FillByte

Código:

procedure FillByte(

  var x;

  count: SizeInt;

  value: Byte

);

El valor que debes de poner tiene que ir de 0 a 255, que en tu caso tendría que ser un 0 para que sea como ZeroMemory

http://lazarus-ccr.sourceforge.net/d.../fillbyte.html

danielmj 31-03-2018 15:24:30

Hola estoy teniendo problemas con el ordenador (posiblemente placa) l lo digo por si veis que no contesto a vuestros mensajes, que es por ese motivo.
tsk voy a probar lo que comentas. Gracias.

edito: He probado lo de FillByte y sigue dando el mismo error.. sigo investigando.

tsk 01-04-2018 07:35:53

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


danielmj 07-04-2018 02:10:05

Hola de nuevo, he tenido una semana liado con el pc, pensaba que era cosa de placa pero era la fuente.
Vuelvo a retomar el trabajo y ahora si funciona tsk. Gracias.

danielmj 07-04-2018 10:39:33

Buenos dias, he probado lo que dices tsk y me encuentro con que la unidad UTAlea encargada de generar números aleatorios, repite los números cosa que antes de implementarla para lazarus no hacía. Adjunto dos unidades (en delphi y en lazarus) para que veas, veais las diferencias que son mínimas.
Mientras la versión para delphi lo hace perfectamente, incluir la linea
Código:

FillByte(Lista^,1+10*SizeOf(Boolean),0);
hace que los números salgan repetidos.

Delphi
Lazarus

Al subir uno de los archivos al servidor ftp no me di cuenta y lo subí sin asignar una carpeta adecuada, se subió a la raiz. Que algún administrador lo borre. Sorry.

Captura de repetición de númeos aleatorios

Un saludo.

Ñuño Martínez 10-04-2018 12:21:00

Veo que has cambiado "Maximo" por " 10*SizeOf(Boolean)" en algunos sitio. ¿Por qué razón? Aunque la verdad es que no sé si tiene que ver con que se repitan números.

tsk 11-04-2018 01:50:32

Si debería ser Maximo*SizeOf(Boolean).

Aunque no creo que FillByte sea el que cause los números repetidos, ya que lo único que hace es poner los el arreglo a 0. Eso debe estar en otra parte del código. En un rato hago otras pruebas para descartar que se pudieran sobre escribir sectores de memoria que pudiera interferir, aunque no lo creo.


La franja horaria es GMT +2. Ahora son las 05:51:16.

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