arrayhunter Geschrieben 23. November 2005 Geschrieben 23. November 2005 hallo, ich habe ein Problem bei einer Aufgabenstellung. in Delphi bin ich eher Anfänger. Ich versuche, einen String( in eine Textbox eingegeben) in ein Array von Char zu wandeln. In einer Button_Click-Prozedur mache ich folgendes: 1.Einlesen des Strings und Kopieren in ein Char-Array procedure TForm1.Button1Click(Sender: TObject); var myString : String; var i,j : Integer; var myCharArray : Array of char; begin // Textbox auslesen myString := txtEingabe.Text; // Länge des Char-Arrays setzen SetLength(myCharArray,length(txtEingabe.Text)+ 1); // Kopieren der Werte des Arrays myString in neues Array // myCharArray for i:= 0 to length(myString) do try myCharArray[i] := myString[i]; except ShowMessage('Fehler'); end; 2. Ausgabe des globalen Char-Arrays // Ausgabe des Arrays myCharArray for j:=0 to length(myCharArray) do try lblAusgabe.Caption := lblAusgabe.Caption + '_' + myCharArray[j]; except ShowMessage('Fehler'); jetzt bringt mir das Programm manchmal einen Fehler "Speicherverletzung bei Adresse XXXX". Auuserdem werden mir bei der Ausgabe im Label manchmal seltsame Steuerzeichen ausgegeben, wie bekomme ich diese weg ? Wäre nett, wenn mal jemand rüberschauen könnte und ev. die Fehlerquelle aufdecken kann !Kopie von CharArray.rar Zitieren
geloescht_JesterDay Geschrieben 23. November 2005 Geschrieben 23. November 2005 ich habe ein Problem bei einer Aufgabenstellung. in Delphi bin ich eher Anfänger. Ich versuche, einen String( in eine Textbox eingegeben) in ein Array von Char zu wandeln. Ein String ist ansich nichts anderes, als ein Array of Char. nur mit der Besonderheit, dass bei Delphi-Strings an der ersten Position des Arrays die Länge steht. Aussedem hier ein Auszug aus der Delphi-Hilfe: n vielen Programmiersprachen, z. B. in C und C++, fehlt ein spezieller String-Datentyp. Diese Sprachen und die mit ihnen programmierten Umgebungen verwenden so genannte nullterminierte Strings. Ein nullterminierter String ist ein Zeichen-Array, dessen Index bei 0 beginnt und das mit einer NULL (#0) endet. Da das Array keine Längenangabe hat, wird das Ende des Strings durch das erste NULL-Zeichen markiert. Die Verarbeitung nullterminierter Strings erfolgt in Delphi mithilfe von Routinen, die sich in der Unit SysUtils befinden (siehe Standardroutinen und E/A). Dies ist beispielsweise erforderlich, wenn Sie Daten gemeinsam mit Systemen benutzen, die nullterminierte Strings verwenden. Hier einige Beispiele für die Deklaration von Typen, die nullterminierte Strings speichern können: type TIdentifier = array[0..15] of Char; TFileName = array[0..259] of Char; TMemoText = array[0..1023] of WideChar; Wenn die erweiterte Syntax aktiviert ist ({$X+}), können Sie einem statisch zugewiesenen Zeichen-Array, dessen Index bei 0 beginnt, eine String-Konstante zuweisen. Mit einem dynamischen Array ist dies nicht möglich. Wenn Sie eine Array-Konstante mit einem String initialisieren, der kürzer als die deklarierte Länge des Arrays ist, werden die verbleibenden Zeichen auf #0 gesetzt. Also kannst du damit ja auch einfach den String in ein Array kopieren. Dann gibst du eben eine maximale Stellenanzahl vor 0..1023 für 1KB Text z.B. EDIT: Ups, geht ja scheinbar nur mit Konstanten... müsstest du aber mal probieren, wie das mit dem Zuweisen bei einem Array (s.o.) geht. Ich würde aber sagen: type TMyString = array[0..254] of Char; var aStr: String; MyString: TMyString; ... aStr:= 'Hallo'; MyString:= aStr; // Vielleicht auch umwandeln mit [b]pchar(aStr), // oder MyString:= 'Hallo' direkt[/b] sollte auch gehen. Hab ich jetzt aber nicht getestet. Zitieren
grueni Geschrieben 23. November 2005 Geschrieben 23. November 2005 ... jetzt bringt mir das Programm manchmal einen Fehler "Speicherverletzung bei Adresse XXXX". Auuserdem werden mir bei der Ausgabe im Label manchmal seltsame Steuerzeichen ausgegeben, wie bekomme ich diese weg ? Wäre nett, wenn mal jemand rüberschauen könnte und ev. die Fehlerquelle aufdecken kann ! Eine Speicherverletzung kriegst du hier auf jeden Fall, wenn man einfach nix eingibt und auf OK klickt. Du solltest deine Variablen initialisieren und abprüfen, ob in dem Editfeld überhaupt was steht. Beim Kopieren vom String in den Array sollte man das Längenbyte des Strings berücksichtigen, also so: for i:=1 to length(myString) do begin myCharArray[i-1] := myString[i]; end; Die komischen Zeichen, die bei dir mit ausgegeben werden sind keine Steuerzeichen, du liest in der Ausgabeschleife einfach ein Zeichen zu weit. Du mußt von der Länge des Array natürlich 1 abziehen, dein erstes Element hat den Index 0! for i:=0 to length(myCharArray)-1 do lblAusgabe.Caption := lblAusgabe.Caption + '_' + myCharArray[i]; Ich hoffe das hat dir weitergeholfen Mfg grueni Zitieren
arrayhunter Geschrieben 23. November 2005 Autor Geschrieben 23. November 2005 danke grueni, ich hatte bei beiden Schleifen das -1 nicht berücksichtigt. jetzt funktioniert es Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.