2009-08-05 4 views
0

Ich habe eine Funktion geschrieben, die mir die Länge eines dynamischen Arrays gibt, indem ich es in String umwandeln und Länge (trim (string)) abfrage;Ungültige Typen: 'Array' und 'dynamisches 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; 

In meinem Hauptprogramm las i Text in einen String, wandelt es in Array

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

und zu tun:

ShowMessage(IntToStr(arraylength(cChar))); 

ich die Fehler wie im Titel angegeben.

+3

Der Rest Ihres Codes ist sehr kaputt. Der Basisindex der Arrays ist null. Die Basisadresse der Strings ist eins. Weder Zeichenfolgen noch Arrays enthalten etwas, bis Sie SetLength aufrufen. Sie sollten die Länge von 's' außerhalb der Schleife überprüfen; Andernfalls sollten Sie eine Warnung erhalten, dass die Funktion möglicherweise keinen Wert zurückgibt. Warum konvertieren Sie Ihre Zeichenfolge in ein Array, wenn Sie das nächste, was Sie tun, in eine Zeichenfolge stopfen? –

+1

Schauen Sie in * StrLen() * und ähnliche Funktionen. Warum benutzt du * PChar * überhaupt nicht? – mghie

Antwort

4

Wenn Sie Arrays an Prozeduren und Funktionen in Delphi übergeben, sollten Sie sie als separaten Typ deklarieren. Also:

type 
    MyArray = array of char; 

und dann

function arraylength(a: MyArray): integer; 

BTW: Warum nicht verwenden Sie integrierte Funktionen wie Länge()? In Delphi2009 ist der Typ string eine Unicode-Zeichenfolge, daher gibt Length die Länge in Zeichen und nicht in Byte zurück.

+0

Ich benutze es nicht, weil ich in diesem Fall ein dynamisches Array habe und die Länge (cChar) aufgrund der dynamischen Zuweisung von Speicherplatz etwas größer als die tatsächliche Anzahl der Zeichen im Array zurückgibt. Eine Funktion, die mir die tatsächliche Anzahl von Zeichen gibt, würde sehr geschätzt werden. – Acron

+0

Sie meinen, Sie haben Array von etwa 20 Elemente, kaufen Sie nur 15 im Moment verwenden? – smok1

+0

Das ist absolut richtig. – Acron