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 29-08-2006
Roberto Sánchez Roberto Sánchez is offline
Registrado
 
Registrado: ago 2006
Posts: 4
Poder: 0
Roberto Sánchez Va por buen camino
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

Última edición por dec fecha: 29-08-2006 a las 04:31:21.
Responder Con Cita
  #2  
Antiguo 29-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 29-08-2006
Northern Northern is offline
Miembro
 
Registrado: ene 2006
Posts: 211
Poder: 19
Northern Va por buen camino
Hola

Intenta declararlo como packed


Saludos
Responder Con Cita
  #4  
Antiguo 29-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 30-08-2006
Roberto Sánchez Roberto Sánchez is offline
Registrado
 
Registrado: ago 2006
Posts: 4
Poder: 0
Roberto Sánchez Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 10-09-2006
Roberto Sánchez Roberto Sánchez is offline
Registrado
 
Registrado: ago 2006
Posts: 4
Poder: 0
Roberto Sánchez Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 10-09-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.
Responder Con Cita
  #8  
Antiguo 11-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 11-09-2006 a las 18:41:05.
Responder Con Cita
  #9  
Antiguo 11-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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. )
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 11-09-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile 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 . 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.
Responder Con Cita
  #11  
Antiguo 12-09-2006
Roberto Sánchez Roberto Sánchez is offline
Registrado
 
Registrado: ago 2006
Posts: 4
Poder: 0
Roberto Sánchez Va por buen camino
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 ...

Última edición por Roberto Sánchez fecha: 12-09-2006 a las 03:32:43.
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
Usar la libreria crt.dcu de Turbo Pascal 7 en delphi 2205 nunez1984 API de Windows 10 08-03-2010 04:36:34
Las Turbo Tools estan devuelta :) Epachsoft Noticias 54 25-12-2006 02:39:13
manual de excepciones de object pascal para free pascal??? Garion OOP 3 27-05-2005 00:42:29
compatibilidad entre Turbo Pascal 7 y Delphi 7 !! Jat Varios 0 13-12-2004 23:24:34
Instalar TpOrpheus de Turbo Power Delfino OOP 3 18-10-2003 11:19:08


La franja horaria es GMT +2. Ahora son las 11:29:20.


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