Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   From turbo pascal to delphi6 (https://www.clubdelphi.com/foros/showthread.php?t=35020)

Roberto Sánchez 29-08-2006 04:20:05

From turbo pascal to delphi6
 
Tengo un porgrama escrito con turbo pascal 7. Para escribir un fichero (una bioseñal) que tiene dos partes (un encabezamiento y un cuerpo) utiliza el siguiente record para el encabezamiento:

Código Delphi [-]
TSTTYPE=record
        pacname:string[25];
        hcl    :string[11];
         dia    :integer;
         mes    :integer;
         ano    :integer;
         time   :string[4];
         testype:string[25];
         period :real;
         minut  :integer;
         segun  :integer;
         nochanel :integer;
         chanel  :array[1..maxchanel-1] of chanel; //maxchanel=9 (a constant)
         obs     :array[1..3] of obs; //OBS=STRING[44]
         tpr     :real;
         pesobit :array[1..maxchanel-1] of real;
         units   :array[1..maxchanel-1] of unid; // UNID=STRING[4];
         codgrab :byte;
         chanels :array[1..maxchanel-1] of byte;
         status  :boolean;
         end;

Después del usuario entrar los datos, la variable dattst (de tipo tsttype) es escrita en un ficherode esta manera:

Código Delphi [-]
   write(FICHTST,DATTST);

Entonces:

Código Delphi [-]
   seek(fichint,round(sizeof(DATTST)/2));

para comenzar a escribir el cuerpo del fichero (enteros) después del encabezamiento.

Hata aquí todo está bien en turbo pascal 7. El módulo de procesamiento lee bien el fichero resultante.
Ahora, utilizo el mismo código con Delphi6 de la misma forma, escribo el fichero, pero cuando voy a abrirlo recibo un runtime error y el programa aborta.

Al ver un fichero original y el que hago con delphi con un editor hexadecimal, son diferentes (el tamaño del encabezamiento, por ejemplo).

¿Qué puede estar pasando y cómo lo resulevo?

Cualquier otro dato, o si hace falta un fichero de muestra, por favor pedirlo.

Gracias por adelantado
R. Sanchez

dec 29-08-2006 04:29:22

Hola,

Bienvenido al ClubDelphi Roberto. Por favor, revisa la guía de estilo de estos Foros.

Echa un vistazo a cómo puedes conseguir resaltar la sintaxis del código fuente de Delphi cuando lo incluyas en tus mensajes. En este caso he editado tu mensaje para encerrar el código entre sus correspondientes etiquetas.

Basta conque encierres tu código fuente entre las etiquetas [ DELPHI ] y [ /DELPHI ] (sin dejar espacios, que aquí los dejo yo para que se vean las etiquetas y no se tomen como lo que son realmente.

Northern 29-08-2006 11:21:57

Hola

Intenta declararlo como packed :confused:


Saludos

roman 29-08-2006 14:50:05

Dos preguntas:

Después de escribir el encabezado, ¿por qué mueves el puntero? write deja el puntero al final de lo que escribes. Y, en todo caso, ¿por qué lo mueves la mitad del encabezado y no todo el encabezado?

También sería úitl que dijeras cuál es el código de error. De hecho, puedes ver una lista de ellos buscando I/O Errors en la ayuda de Delphi.

// Saludos

Roberto Sánchez 30-08-2006 04:48:52

De pascal a Delphi 6
 
Cita:

Empezado por roman
Después de escribir el encabezado, ¿por qué mueves el puntero? write deja el puntero al final de lo que escribes.

El fichero es primero abierto como tsttype, se escribe el encabezamiento y entonces es abierto como enteros para escribir el cuerpo. Supongo que al cerrarlo y volverlo a abrir, pero como enteros, el SizeOf del encabezamiento haya sido calculado de esa manera en turbo pascal para situar el puntero en el lugar adecuado (al final del encabezamiento).

Cita:

Empezado por roman
También sería útil que dijeras cuál es el código de error. De hecho, puedes ver una lista de ellos buscando I/O Errors en la ayuda de Delphi.

El fichero fabricado con este programa en turbo pascal está OK y lo abre bien el módulo de procesamiento (hecho también con turbo pascal). Ahora, cuando ese mismo fichero lo hago con Delphi 6, ese módulo no lo puede abrir y el error que da, no alcanzo a verlo (un runtime error del turbo pascal).
He observado algunas cosas, ejemplo, los valores del cuerpo del fichero, declarados como Integer en turbo pascal, en Delphi 6 tengo que declararlo como Word, con la misma línea de pensamiento he probado con el encabezamiento, pero no he encontado la solución.

Gracias mil

R. Sánchez

Roberto Sánchez 10-09-2006 20:38:23

De pascal a Delphi 6
 
Hola,
Según me dice un amigo, el integer de pascal, corresponde al smallint en delphi. Pero con ese cambio sigue sin que los ficheros fabricados sean leidos por el programa en pascal.
¿Qué es packed?

Gracias
R. Sánchez

Al González 10-09-2006 22:22:24

¡Hola a todos!

Cita:

Empezado por Roberto Sánchez
...¿Qué es packed?...

Que tal Roberto. Ahora que las computadoras gozan de mayor capacidad de almacenamiento, la industria le da preferencia a la velocidad de procesamiento. Es por ello que muchos compiladores alinean los campos de una estructura (como el tipo Record de Delphi) de tal manera que resulte más rápido acceder a ellos. Esta alineación consiste en introducir algunos bytes de relleno entre ciertos campos para que éstos queden justo donde puedan ser accedidos más rápidamente por la CPU.

Una manera de impedir que el compilador haga esta alineación es declarar la estructura en cuestión como Packed Record. De hecho eso es lo recomendable cuando tal estructura se utilizará en procesos de almacenamiento y lectura de información en disco. El tamaño de un registro compacto (packed) es la suma del tamaño de sus campos, mientras que un registro alineado (no compacto) suele contener algunos bytes adicionales.

Un abrazo compacto.

Al González. :)

jachguate 11-09-2006 15:35:23

También hay cambios en los tipos de datos. El tipo integer de turbo pascal era un entero de 16 bits, pero el tipo integer de delphi (a partir del 3) es un entero de 32 bits. Esto debido a que Integer es, por decirlo de alguna manera, un tipo de dato "dependiente" de la plataforma.

Esto quiere decir que cuando tengamos un compilador de delphi para 64 bits, el tipo integer será un entero de 64 bits.

El tipo no dependiente de la plataforma, entero de 16 bits, se llama SmallInt.

No lo tengo claro ahora, pero es probable que algo similar pase con el boolean.

Hasta luego.

;)

jachguate 11-09-2006 15:46:04

Hola nuevamente.

Cita:

Empezado por Al González
Que tal Roberto. Ahora que las computadoras gozan de mayor capacidad de almacenamiento, la industria le da preferencia a la velocidad de procesamiento.

El "Ahora", puede malinterprestarse en este caso... pues la posibilidad de alinear o no alinear los registros en memoria ha existido desde al menos turbo pascal 6, donde ya se podían declarar packed records y "records" normales.

No recuerdo ya de pascal 5.5, pero es probable que en este todos los registros fueran no alineados ("packed").

Cita:

Empezado por Al González
De hecho eso es lo recomendable cuando tal estructura se utilizará en procesos de almacenamiento y lectura de información en disco. El tamaño de un registro compacto (packed) es la suma del tamaño de sus campos, mientras que un registro alineado (no compacto) suele contener algunos bytes adicionales.

Yo no me atrevería a decir categóricamente que es lo recomendable... en cada caso habrá que evaluar si conviene mas perder unos cuantos bytes por registro en el disco y la memoria, a cambio de mayor eficiencia de programa o si por el contrario, es mas importante ahorrar bytes sacrificando desempeño.

Hasta luego.
;)

pd.
(Un abrazo condicional. :D )

Al González 11-09-2006 18:59:57

Riesgo de incompatibilidad
 
¡Hola a todos!


Cita:

Empezado por jachguate
...El "Ahora", puede malinterprestarse en este caso... pues la posibilidad de alinear o no alinear los registros en memoria ha existido desde al menos turbo pascal 6...

Tienes razón, tal vez se entendió que esa característica nació en Delphi. Sé que la alineación de tipos estructurados existía ya en algunas versiones de Turbo Pascal, desde que, debido a las nuevas y mayores capacidades de almacenamiento y la cada vez mayor exigencia de velocidad en las aplicaciones, se volvía conveniente sacrificar unos pocos bytes en favor de ésta última.


Cita:

Empezado por jachguate sobre la recomendación de usar "Packed" para almacenamiento en disco
...
Yo no me atrevería a decir categóricamente que es lo recomendable... en cada caso habrá que evaluar si conviene mas perder unos cuantos bytes por registro en el disco y la memoria, a cambio de mayor eficiencia de programa o si por el contrario, es mas importante ahorrar bytes sacrificando desempeño...

Cuando se trata de almacenamiento en disco, se presenta un problema más importante aún: el de la compatibilidad, por ello la recomendación que la propia Borland hace:
Cita:

Empezado por Ayuda de Delphi 7
...Because data alignment can change, it's a good idea to pack any record structure that you intend to write to disk or pass in memory to another module compiled using a different version of the compiler.

Desde luego, aún con esto en mente, algunos desarrolladores preferirán ignorar la recomendación argumentando que los archivos nunca serán accedidos por otras aplicaciones (cuyas reglas de alineación podrían ser diferentes) o que la única aplicación que los usa nunca volverá a ser compilada con versiones posteriores del lenguaje (donde las reglas de alineación podrían cambiar). Pero ya sabemos que nunca es una palabra maldita en programación :D. En fin, es cuestión de poner en la balanza la oportunidad de desempeño contra el riesgo de incompatibilidad.


Un abrazo balanceado.

Al González. :)

Roberto Sánchez 12-09-2006 03:22:44

De pascal a Delphi 6
 
Gracias por sus consejos. Pruebo los cambios que mencionan y aprendo.
Haré saber logros y tropiezos en busca de la solución

R. Sánchez

pd. Un abrazo incondicional y ...


La franja horaria es GMT +2. Ahora son las 07:21:32.

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