Question

J'ai eu la source d'un projet plus ancien et je dois changer de petites choses, mais j'ai eu de gros ennuis à cause de ne que Delphi 2010 pour le faire.

Il y a un enregistrement défini:

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

Plus tard, cette définition est utilisée pour lire à partir du fichier:

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

Le principal problème est que le compilateur n'accepte pas le type "chaîne" dans l'enregistrement car il veut une "finalisation". J'ai donc essayé de changer "String" en "String [255] ou "shortstring". En faisant cela, l'application lit le fichier mais avec un mauvais contenu.

Ma question est de savoir comment convertir l'ancien type "String" avec lequel les fichiers ont été écrits en "nouveaux" types de Delphi 2010.

J'ai déjà essayé beaucoup, par exemple "{$ h-}". L'ajout d'un seul char de plus dans l'enregistrement affiche, le fichier est correct, car le fichier est lu presque correct mais tronqué un char de plus chaque ensemble de données - la longueur de la longueur + 255chars semble être correcte FPR La définition mais les grève ne correspond pas.

Était-ce utile?

La solution

Eek! Il semble que votre code soit préalable ou n'utilise pas de longues chaînes. Si vous souhaitez obtenir le même comportement que dans votre ancien Delphi, vous devez remplacer string avec ShortString.

Je vois que vous avez déjà essayé cela et signalez qu'il échoue. C'est vraiment la seule explication qui me donne un sens parce que tous les autres types de chaînes sont essentiellement des pointeurs et donc le seul moyen le read aurait jamais pu fonctionner est avec un ShortString. La migration que vous essayez est immense et vous avez probablement un grand nombre de problèmes de confusion.

@Lu rd fait un bon point dans les commentaires selon lesquels la disposition des enregistrements peut différer entre les versions Delphi car vous n'utilisez pas packed déployer. Vous pouvez étudier la disposition des enregistrements en utilisant les deux versions Delphi que vous avez à portée de main. Vous devrez organiser que la taille des enregistrements correspond à des versions et que les compensations aux champs correspondent également.

Sur la base des commentaires ci-dessous, l'ajout d'un octet de rembourrage entre POS et NR résoudra vos problèmes.

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

Vous pouvez également obtenir le même effet en définissant le $ALIGN Option de compilateur pour {$ALIGN ON} Ce qui serait ainsi que je pense que je ferais des choses.

À long terme, vous devriez vraiment vous éloigner des chaînes courtes, un codage ANSI, une cartographie directe entre vos enregistrements internes et vos fichiers de données, etc. À court terme, vous pourriez mieux vous procurer la même version de Delphi que celle utilisée pour créer ce code et l'utiliser. Je m'attendais à ce que ce problème ne soit que la pointe de l'iceberg.

Autres conseils

Rappelez-vous juste:

"String" <> "String [255] <> "shortstring" <> ANSistring

De retour dans les vieux jours DOS / Turbo Pascal, les "cordes" étaient en effet limitées à 255 caractères. En grande partie parce que le 1er octet contenait la longueur de chaîne et un octet ne peut avoir qu'une valeur comprise entre 0 et 255.

Ce n'est plus un problème dans les versions contemporaines de Delphi.

"Sortage"est le type pour l'ancien type de chaîne DOS / Pascal.

"Longstring" est le type de chaîne par défaut depuis longtemps (y compris le Borland Delphi 2006 que j'utilise actuellement pour la plupart des travaux de production). De Delphi 3 .. Delphi 2009, Sorts détenait des caractères 8 bits et n'étaient limitées que par la mémoire disponible. De Delphi 3 .. Delphi 2009, "Longstrings" était synonyme de "ANSistrings".

Les versions récentes de Delphi (Delphi 2009 et supérieur, y compris le nouveau Delphi Xe2), sont désormais désormais par défaut des chaînes UNICODE "Widestring" multi-octets. Larges, comme les ansistrations, sont également effectivement "illimités" en longueur maximale.

Cet article explique plus en détail:

http://delphi.about.com/od/beginners/l/aa071800a.htm

PS: Envisagez d'utiliser "Sizeof (BBIL)" et "Emballé"Pour les dossiers binaires.

Peut-être que je néglige quelque chose, mais, comme je le vois, votre code Delphi 3 est également cassé. Essayez de déterminer la taille de votre dossier:

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

Chemin (tout entre 1 et 256 - un octet pour la longueur, repos pour les données), pos (1 octet), nr (2 octets), ce qui fait que la taille des données d'enregistrement varie de 1 + 1 + 2 = 4 octets à 256 + 1 + 2 = 259 octets. Dans cette circonstance, vous obtiendrez des déchets dans tous les cas, car votre programme ne peut pas maintenant le nombre d'octets à lire, avant de lire les données. Je vous suggère de réparer votre enregistrement afin que la chaîne soit de taille fixe, comme:

path : ShortString[255];

Ensuite, vous pourriez écrire et lire bien dans Delphi 3 et 2010.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top