2012-03-22 20 views
3

私の知識の文字列はデルファイに基づいて、0の位置は長さのために予約されています。私はD5とD2006で書かれた巨大なアプリケーションを担当しています.D5とD2006は0インデックスからコピーすることによってコピー機能を使用しています。この瞬間にいくつかの同僚もこのようにコーディングしています。これはDelphiの「魔法」機能なので、0のインデックスから文字列をコピーするのにCopyが使用されても、その背後では1の位置からコピーされます。デルファイ - System.Copy良い練習

私にとっては、最初の位置からの文字列、0の位置からの文字列ではなく、結果は同じです。

私の質問は、1つの位置からコピーするのではなく、0の位置からコピー機能を使用して、他のDelphiのバージョンに渡すときに影響を受けるアプリケーションですか?

+1

旧式のShortStringの長さは0桁です。よく使われる文字列(AnsiStringなど)の構造はより複雑です – MBo

+0

文字列の長さは、 'var MyShortStr:ShortString;'のように明示的に 'ShortString'を宣言しない限り、Delphi 1以降はインデックス0にありません。 'var MyShortString:String [255]; 'あなたとあなたの同僚は、しばらくの間、書籍を購入したり、ヘルプファイルを読む必要があります。 :) –

答えて

2

Indexのパラメータとして0を渡して、文字列にCopyを指定すると、Delphi RTLはあなたを無視します。 Indexに0以下を渡すと、RTLは1の値を使用します。だからあなたがやっていることは、1を渡すか、1より小さい値の間に振る舞いに目に見える差異がないという点で、妥当なことです。しかし、デルファイの文字列インデックスとして0を使用することは確かに紛らわしくありません。擬似コードで

、このようなCopy開始の実装:

function Copy(s: string; Index, Count: Integer): string; 
begin 
    if Index<1 then 
    Index := 1; 
    dec(Index);//convert from 1-based to 0-based indexing 
    ....continues 

は、実際に、実際の実装では、もう少し複雑であるが、上記の擬似コードは正しいセマンティクスを与えます。

古いスタイルの短い文字列の場合、インデックス0に格納される長さに関するコメントはtrueです。しかし、長い文字列には当てはまりません。実際、文字列は1から始まりダイナミック配列、リストなどは0ベースであるという奇妙な状況に至ったのは、まさにこの事実でした。

+4

良性、それがクラッシュしない限り。しかし、暗いと間違いなくコード臭い。私がこれらの人々をコードレビューしていたならば、それがどのようにオフラインでのエラーを含むあらゆる種類の開発者の混乱につながるかを指摘したいと思います。 –

+0

文字列セマンティクスを0インデックスに変更する原因となる問題がどれだけあるのだろうか。私はC++ Builderのコードを持っていると、特に混乱していると思います。なぜなら、Delphi、1-Indexedの 'String'と(C++ std、0-indexed)' wstring'sの両方を使用できるからです。インデックスによる文字は非常にまれなことです。メモリから、私は考えています*アレンバウアーは一度ブログの投稿を書いた - 保証はありません、私は音を覚えています 'それを投げている - ish - それはいつか変更される可能性があります。 –

+0

私は、1インデックスの文字列が主要なPITAであることを発見しました。私がここに投稿したコード例でさえ、 '0 to length(stringThing)-1'という文字列をインデックスする間違いをしました。他のすべてのイテレータ、stringLists、listViews、コンポーネント、コントロールなどはすべて '0 to thingy.count-1'なので、なぜ文字列ではないのですか? –

関連する問題