Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben
...

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...