Wörter spiegeln?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
ghostrider99
Beiträge: 2
Registriert: Do 25. Sep 2008, 18:43

Wörter spiegeln?

Beitrag von ghostrider99 »

Hi,
ich bin Lazarus-Neuling und wollte ein Programm entwickeln mit dem man Wörter spiegeln kann. Also man gibt ein Wort ein (z.b: Name) und es erschein das Wort rückwärts (z.b:emaN). Ich habe es versuch, aber dann kommt immer die Meldung:
"Project project1 raised exception class 'External:SIGSEGV'."

Hier ist mein Versuch:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
 
var
n,t: string;
s,i,z: integer;
 
begin
  n:=Edit1.Text;
  s:=length(n);
  t:='';
  z:=1;
 
  For i:=1 to s do
       begin
         n[s]:=t[z];
         s:=s-1;
         z:=z+1;
       end;
 
  Edit2.Text:=t;
end;
Bitte kann mir jemand meinen Fehler zeigen.
Danke, im Vorraus
Zuletzt geändert von monta am Do 25. Sep 2008, 19:53, insgesamt 1-mal geändert.
Grund: Codetags gesetzt

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Wörter spiegeln?

Beitrag von theo »

Du greifst auf t[z] zu obwohl t anfänglich leer ist.

Das kann man viel einfacher haben:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var n,t: string;
i: integer;
begin
 n:=Edit1.Text;
 for i:=1 to length(n) do t:=n[i]+t;
 Edit2.Text:=t;
end;
Aber Achtung: Bei einem UTF-8 Interface musst du erst nach WideString wandeln.

ghostrider99
Beiträge: 2
Registriert: Do 25. Sep 2008, 18:43

Re: Wörter spiegeln?

Beitrag von ghostrider99 »

Danke!

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Wörter spiegeln?

Beitrag von marcov »

theo hat geschrieben:Du greifst auf t[z] zu obwohl t anfänglich leer ist.

Das kann man viel einfacher haben:
Ja.

Code: Alles auswählen

Uses Strutils;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 edit2.text:=reversestring(edit1.text);
end;
Ich mag die originale Lösung mehr als die s:=s+n[x] Lösung. (und die RTL Routine nutzt dieser glaube ich)

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Wörter spiegeln?

Beitrag von Euklid »

marcov hat geschrieben:

Code: Alles auswählen

edit2.text:=reversestring(edit1.text);
Schon sehr faszinierend, was für Befehle der FPC alles unterstützt :)

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Wörter spiegeln?

Beitrag von alexander »

jaa echt witzig für was alles schon ein befehl da ist... allerdings verbringt man bei solchen Sachen länger beim nach-dem-Befehl-suchen als beim selber programmieren...
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Wörter spiegeln?

Beitrag von knight »

Als FPC Entwickler ist Marco natürlich klar im Vorteil :)

knight

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Wörter spiegeln?

Beitrag von theo »

Ich dachte der OP wollte eine Programmierübung machen und habe ihn deshalb nicht auf eine Fertig-Lösung verwiesen.
Ebenso habe ich mir überlegt, dass für Anfänger mein Beispiel einfacher zu verstehen ist, als eine Version mit SetLength.
Ansonsten bevorzuge ich natürlich auch den Ansatz wie er in reversestring umgesetzt ist, ausser dass er für UTF-8 nicht funktioniert, worauf ich hingewiesen habe (Problem fängt bei deutschen Umlauten öäü an).

Eine dem UTF-8 Interface angepasste Version könnte so aussehen:

Code: Alles auswählen

Function ReverseStringUTF8(const AText: UTF8String): UTF8String;
var
    i,j:longint;
    s1,s2:WideString;
begin
  s1:=UTF8Decode(AText);
  setlength(s2,length(s1));
  i:=1; j:=length(s1);
  while (i<=j) do
    begin
      s2[i]:=s1[j-i+1];
      inc(i);
    end;
    Result:=UTF8Encode(s2);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.text:=ReverseStringUTF8(Edit1.text);
end;

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Wörter spiegeln?

Beitrag von marcov »

theo hat geschrieben:Ich dachte der OP wollte eine Programmierübung machen und habe ihn deshalb nicht auf eine Fertig-Lösung verwiesen.
Ebenso habe ich mir überlegt, dass für Anfänger mein Beispiel einfacher zu verstehen ist, als eine Version mit SetLength.
Ansonsten bevorzuge ich natürlich auch den Ansatz wie er in reversestring umgesetzt ist, ausser dass er für UTF-8 nicht funktioniert, worauf ich hingewiesen habe (Problem fängt bei deutschen Umlauten öäü an).
Die reversestringutf8 Routine fehlt auf alle surrogate Paare von UTF-16 statt von UTF-8. IAW das Problem bleibt.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Wörter spiegeln?

Beitrag von theo »

marcov hat geschrieben: IAW das Problem bleibt.
Theoretisch ja. Ich glaube aber, dass diese (ad hoc) Lösung für 99,99 % der Fälle ausreicht.
Wer Byzantinische Musiksymbole umdrehen muss, braucht allerdings eine andere Lösung.

Wer weiss, vielleicht nimmt uns FPC und RTL diese Probleme eines Tages ab.

Edit: So geht's wohl auch für Byzantinische Musiksymbole

Code: Alles auswählen

uses LCLProc;
 
Function ReverseStringUTF8(const AText: UTF8String): UTF8String;
 var i:integer;
begin
  Result:='';
  for i:=1 to UTF8Length(AText) do Result:=UTF8Copy(AText,i,1)+Result;
end;
Effizient ist das aber nicht gerade.

Antworten