Pregunta

Tengo el código fuente de un proyecto antiguo y tiene que cambiar pequeñas cosas, pero tengo un gran problema, porque de tener sólo delphi 2010 para hacer eso.

Hay un registro se define como :

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;

después de esta definición se utiliza para leer el archivo :

b_bil: file of bbil;
pbbil: ^bbil;
l_bil : tlist;

while not(eof(b_bil)) do
  begin
    new(pbbil);
    read(b_bil, pbbil^);
    l_bil.add(pbbil);
  end

El principal problema es que el compilador no acepta el tipo "cadena" en el registro, ya que quiere una "finalización".Así que traté de cambiar "cadena" a "cadena[255]" o "tipo shortstring".Haciendo esto, la aplicación es leer el archivo pero con mal contenido.

Mi pregunta es ¿cómo convertir el viejo tipo "string" con el que se han escrito a los "nuevos" tipos en Delphi 2010.

Ya lo he intentado un montón por ejemplo,"{$H-}".La adición de una sola char más en la muestra en el registro, el archivo es correcto, porque el archivo es de lectura casi correcta, pero truncada carácter más cada conjunto de datos - la longitud de lengthbyte+255chars parece ser correcta la iap la definición de tipo shortstring pero no es coincidente.

¿Fue útil?

Solución

Eek!Parece que el código ya sea antes de las fechas o no el uso de cadenas largas.Si usted desea conseguir el mismo comportamiento que en su antigua Delphi, entonces usted necesita para reemplazar string con ShortString.

Veo que has probado ya y el informe de falla.Realmente es la única explicación que tiene sentido para mí porque todos los otros tipos de cadena son esencialmente los punteros y así la única manera de que el read jamás podría haber trabajado con un ShortString.La migración está intentando es inmenso, y usted probablemente tiene un gran número de problemas de confusión.

@LU RD hace un buen punto en los comentarios que el diseño de registro puede variar entre versiones de Delphi ya que usted no está utilizando una packed de la matriz.Usted puede investigar el diseño de registro utilizando las dos versiones de Delphi que tiene a mano.Usted tendrá que organizar que el tamaño de los registros partido entre versiones, y que los desplazamientos a los campos de partido.

Basado en los comentarios de abajo, la adición de un relleno de bytes entre el pos y el nr va a resolver sus problemas.

bbil = record
  path : string;
  pos: byte;
  _pad: byte;
  nr: Word;
end;

También se podría conseguir el mismo efecto mediante el establecimiento de la $ALIGN opción de compilador {$ALIGN ON} que sería lo que yo pienso que yo haría las cosas.

En el largo plazo, usted realmente debería alejarse de cadenas cortas, la codificación ANSI, asignación directa entre los internos de los registros y los archivos de datos y así sucesivamente.En el corto plazo que puede ser mejor hacerse de la misma versión de Delphi como fue utilizada para construir este código y el uso que.Yo esperaría que este asunto sea sólo la punta del iceberg.

Otros consejos

solo recuerda:

"cadena" <> "[255]" <> "ShortString" <> ANSISTRING

Volver en los viejos días de Pascal DOS / TURBO, "cadenas" se limitaron a 255 caracteres. En gran parte porque el primer byte contenía la longitud de la cadena, y un byte solo puede tener un valor entre 0 y 255.

que ya no es un problema en las versiones contemporáneas de Delphi.

" Shortstring " es el tipo para el viejo DOS / Pascal Tipo de cadena.

"LongString" ha sido el tipo de cadena predeterminada durante mucho tiempo (incluida la Borland Delphi 2006 que actualmente uso para la mayoría de los trabajos de producción). Desde Delphi 3 .. Delphi 2009, longstrings ocupados personajes de 8 bits, y fueron limitados solo por la memoria disponible. Desde Delphi 3 .. Delphi 2009, "Longstrings" fueron sinónimo de "Ansirmaciones".

Versiones recientes de Delphi (Delphi 2009 y más, incluido el nuevo Delphi XE2), todos los ajustes predeterminados de Multi-byte Unicode "WIDESTE". Widestrings , como ansirmaciones, también son efectivamente "ilimitados" en la longitud máxima.

Este artículo explica con más detalle:

http://delphi.about.com/od/beginners/l/ AA071800A.HTM

PS: Considere el uso de "STEYOF (BBIL)" y " envasado " para registros binarios .

Quizás estoy pasando por alto algo, pero, a mi modo de ver, su código de Delphi 3 también está roto.Intente determinar el tamaño de su registro:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;

ruta (cualquier cosa entre 1 y 256: un byte para la longitud, resto para los datos), pos (1 byte), nr (2 bytes), lo que hace que el tamaño de los datos de registro varíe de 1 + 1 + 2= 4 bytes a 256+ 1 + 2= 259 bytes.En esa circunstancia, obtendría basura del archivo en cualquier caso, ya que su programa no puede ahora cuántos bytes leer, antes de leer los datos.Le sugiero que arregle su registro para que la cadena sea de un tamaño fijo, como:

path : ShortString[255];

Entonces, podrá escribir y leer bien tanto en Delphi 3 como en 2010.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top