文字列の問題に移行Delphi3デ2010年
-
29-10-2019 - |
質問
私の源泉は古いプロジェクトへの変化の少ないものも大きなトラブルのみのデ2010年になる。
あの記録と定義:
bbil = record
path : string;
pos: byte;
nr: Word;
end;
この定義を読み込むために使用します。からファイル:
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
一番の問題は、コンパイラは、受け入れられないものでありタイプ"文字列"の記録がいたいのは、"決定".私を変えようとした"文字列"を"string[255]"または"shortstring".このアプリはファイルの読み込みが間違った内容です。
私の問題は、これらの"文字列"タイプのファイルに書き込まれ""新型イン2010.
いた例"{$H-}".追加のみcharのレコードが示しているように、ファイルが正しいので、ファイルを読み込みますとほぼ正しいもの切り捨て一charより各データセットの長さlengthbyte+255charsが正しい外国人特別の定義がshortstringないマッチングです。
解決
eek!それはあなたのコードの事前日時または長い文字列を使用していないようです。古いDelphiと同じ動作を取得したい場合は、string
をShortString
に置き換える必要があります。
私はあなたが既にそれが失敗したことを報告したことを見ます。他のすべての文字列タイプは基本的にポインタであるため、read
が実行された唯一の方法は、ShortString
との唯一の方法です。あなたが試みているマイグレーションは莫大であり、あなたはおそらく膨大な数の混乱した問題を抱えています。
@LU RDは、packed
アレイを使用していないため、レコードレイアウトがDelphiバージョン間で異なる場合があるコメントを適切にします。手に持っている2つのDelphiバージョンを使用してレコードレイアウトを調査できます。レコードのサイズがバージョン間で一致すること、およびフィールドへのオフセットも一致することを配置する必要があります。
以下のコメントに基づいて、POSとNRの間にパディングバイトを追加すると問題が解決されます。
bbil = record
path : string;
pos: byte;
_pad: byte;
nr: Word;
end;
.
$ALIGN
コンパイラを設定することでも同じ効果を得ることができます。私が物事について行くだろうと思う方法でしょう。
長期的に実行されている場合は、短い文字列、ANSIエンコーディング、内部レコードとデータファイルの間の直接マッピングから逃げる必要があります。短期的には、このコードを構築して使用したのと同じバージョンのDelphiの保留を取得するのが良いかもしれません。この問題が氷山の一角になると予想したいと思います。
他のヒント
とを覚えておいてください:
"文字列" <>"string[255]" <>"shortstring" <>AnsiString
背中古DOS/Turbo Pascal日の"文字列"することを確かなものに限る255文字です。うための第1バイト文字列の長さをバイトをすることはできる値は0~255までです。
なくなった問題に現代バージョンをご利用いただけます:standardとexpress。
"ShortString"タイプのDOS/パスカルの文字列タイプです。
"LongString"について、デフォルトの文字列タイプのために長い時間を含むBorland Delphi2006年からは、現在使用のための最も生産。からのデルフィ3..デ2009年 LongStrings 開催8-bit文字をとったものに限ご利用いただけますよ。からのデルフィ3..Delphiは、2009年"LongStrings"の代名詞"AnsiStrings".
最近のバージョンとインターネットで提供ョ2009年以上を含む新しいデXE2)現在、このデフォルトのマルチバイトUnicode"WideString"の文字列です。 WideStrings, のように、AnsiStringsも効果的に"無制限"の最大長さです。
この記事で説明しています。詳細:
http://delphi.about.com/od/beginners/l/aa071800a.htm
PS:利用を考える"sizeof(bbil)"および"満載"バイナリーの記録。
私は何かを見下ろすかもしれませんが、私がそれを見る方法、あなたのDelphi 3コードも壊れています。レコードのサイズを確認してください。
bbil = record
path : string;
pos: byte;
nr: Word;
end;
.
パス(1から256の間のもの - 長さのための1バイト、データのための1バイト)、POS(1バイト)、NR(2バイト)、レコードデータサイズは1 + 1 + 2= 4バイトから256まで変化します。+ 1 + 2= 259バイト。その状況の下で、プログラムは実際にデータを読み込む前に、プログラムが読み取ることができないので、いずれの場合もファイルからガベージを受けるでしょう。文字列が固定サイズであるようにあなたのレコードを修正することをお勧めします。
path : ShortString[255];
.
それでは、Delphi 3と2010の両方で罰金を書いて読むことができるでしょう。