2009-08-05 7 views
0

動的配列の長さを文字列に変換し、長さを問い合わせる関数を書いた(trim(string));私のメインプログラムで無効な型: 'Array'と 'dynamic array'

function arraylength(a: array of char): integer; 
var i: integer; 
s: string; 
begin 
    for i:=0 to high(a) do 
    begin 
    s[i] := a[i-1]; 
    Result := length(trim(s)); 
    end; 
end; 

私は、文字列にテキストを読んで、配列

procedure TForm1.Button2Click(Sender: TObject); 
var i: integer; 
begin 
    for i:=0 to length(sString) do 
    begin 
    cChar[i] := sString[i]; 
    end; 
end; 

とやるに変換:タイトルに記載されているように、私はエラーを取得する

ShowMessage(IntToStr(arraylength(cChar))); 

+3

残りのコードは非常に壊れています。配列の基本インデックスはゼロです。文字列のベースアドレスは1です。 SetLengthを呼び出すまで、文字列も配列も何も含まれていません。ループの外側で 's'の長さをチェックする必要があります。それ以外の場合は、関数が値を返さない可能性があるという警告が表示されます。なぜあなたは文字列を配列に変換していますか?次のことは、文字列に戻すことができればどうですか? –

+1

* StrLen()*と同様の機能を調べてください。最初に* PChar *を使っていないのはなぜですか? – mghie

答えて

4

デルファイのプロシージャと関数に配列を渡すときは、別の型として宣言する必要があります。したがって:

type 
    MyArray = array of char; 

、その後ところで

function arraylength(a: MyArray): integer; 

:なぜあなたは(長さのような組み込み関数を使用していませんか)? Delphi2009では、string型はUnicode文字列なので、Lengthは長さをバイト単位ではなく文字単位で返します。

+0

私は動的配列を持ち、長さ(cChar)は配列の実際の文字数より大きい何かをスペースの動的割り当てのために返すので、Imを使用していません。私に実際の文字数を与える関数は非常に高く評価されます。 – Acron

+0

あなたは20個の要素を配列していることを意味しますが、今は15個しか使用しませんか? – smok1

+0

これは絶対に当てはまります。 – Acron