Probleme bei Stringoperationen(Copy) [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Probleme bei Stringoperationen(Copy) [gelöst]

Beitrag von Komoluna »

Liebes Forum,

ich glaube ich steh mal wieder aufm Schlauch.
Vielleicht könnt ihr mir ja helfen:

Ich habe eine kurze Funktion, die einen String konvertieren soll:

Code: Alles auswählen

function ConvertVariable(aLine: string): string;
  var
    Varname: string;
    ValuePreset: string;
    x: integer;
  begin
    ValuePreset := '0';
    if Pos('=', aLine) > 0 then
    begin
      x := Pos(';', aLine) - 1;
      if x < 0 then x := Length(aLine);
      ValuePreset := Copy(aLine, Pos('=', aLine) + 1, x);
      ValuePreset := Trim(ValuePreset);
      aLine := Copy(aLine, 0, Pos('=', aLine) - 1);
    end;
    x := Pos(';', aLine) - 1;
    if x < 0 then x := Length(aLine);
    Varname := Trim(Copy(aLine, 0, x));
    Result := Format('var #%s %s', [Varname, ValuePreset]);
  end;
Ein paar Beispiele für den Parameter aLine:

Code: Alles auswählen

  X = 0;
  Y;
der String Result soll dann so aussehen:

Code: Alles auswählen

var #X 0
var #Y 0
Aber Result sieht immer so aus:

Code: Alles auswählen

var #X 0;
var #Y 0
Habt ihr ne Idee, woran das liegt?
Wahrscheinlich seh ich mal wieder den Wald vor lauter Bäumen nicht.

MFG

Komoluna
Zuletzt geändert von Komoluna am Do 6. Nov 2014, 17:31, insgesamt 1-mal geändert.
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Probleme bei Stringoperationen

Beitrag von m.fuchs »

Ohne mich jetzt näher mit der Fehlersuche zu beschäftigen, habe ich mir mal Eingabe und Ergebnis angesehen.
Wenn ich das Prinzip richtig verstanden habe, hilft dir folgende Funktion:

Code: Alles auswählen

function ConvertVariable(ALine: String): String;
const
  VarValueDelimiter = ['='];
var
  Varname: String;
  ValuePreset: String;
begin
  ALine := ReplaceStr(ALine, ';', EmptyStr);
  Varname := Trim(ExtractWord(1, ALine, VarValueDelimiter));
  ValuePreset := Trim(ExtractWord(2, ALine, VarValueDelimiter));
  if ValuePreset = EmptyStr then
    ValuePreset := '0';
  Result := Format('var #%s %s', [Varname, ValuePreset]);
end;
Benötigt SysUtils und StrUtils.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Probleme bei Stringoperationen

Beitrag von ruewa »

Hallo Komoluna,

die Zeile

Code: Alles auswählen

ValuePreset := Copy(aLine, Pos('=', aLine) + 1, x);
stimmt nicht, genauer gesagt, der Parameter "x". Die Copy-Funktion erwartet als dritten Parameter die Anzahl der zu kopierenden Chars, Du übergibst aber die Position des Zeichens vor dem Strichpunkt, in dem Beispiel "X = 0;" also 5 statt 1. D.h. es kopiert Dir alles hinter dem Gleichheitszeichen bis zum Ende in die Variable ValuePreset.

Der Fehler ist nicht so interessant wie die Methode, mit der Du ihm auf die Spur kommen kannst. Hast Du schon mal mit dem Debugger und überwachten Ausdrücken gearbeitet? Damit ist es ein Klacks, solche Fehler zu finden!

Der erste Schritt ist, im Editor den Cursor nacheinander auf jede interessante Variable zu setzen und STRG-F5 zu drücken. Damit wird die jeweilige Variable in das IDE-Fenster "Liste der überwachten Ausdrücke" aufgenommen. Dann setzt Du einen Haltepunkt an den Anfang Deiner Funktion, indem Du mit der Maustaste am linken Rand des Editorfensters klickst, die ganze Zeile müßte dann rot unterlegt werden. Läßt Du das Programm nun laufen, stoppt es in dieser Zeile. Mit F8 kannst Du nun Zeile für Zeile abarbeiten und jeweils die Werte der Variablen in der Liste der überwachten Ausdrücke ansehen. Du weißt ja, welche Zuweisung Du in der jeweiligen Zeile erwartest, wenn dann was anderes dabei herauskommt, hast Du die Fehlerzeile schon gefunden. Da kommt dann (für das Beispiel "X = 0;") in der Zeile "ValuePreset := Trim(ValuePreset);" folgendes raus:

Code: Alles auswählen

aLine          'X = 0;'
ValuePreset    ' 0;'
Varname
x               5


und am Ende, wo Du das Ergebnis zuweist ("Result := ..."):

Code: Alles auswählen

aLine          'X '
ValuePreset    '0;'
Varname        'X'
x               2
Das ist ein ziemlich unverzichtbares Werkzeug zur Fehlersuche, und wenn Du damit umzugehen lernst, wird Dir das Aufspüren solcher Fehler nur noch ein müdes Lächeln abringen!

Gruß Rüdiger

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Probleme bei Stringoperationen

Beitrag von Komoluna »

erstmal danke für eure doch recht umfangreichen Antworten.

@m.fuchs:
Die Funktion ExtractWord kannte ich noch garnicht. Hab dann ähnliches immer selber zusammengewürfelt. Danke für den Tipp.

@ruewa: Ich dachte immer Copy währe von String S von Position A bis B
Die Ausdrucküberwachung benutze ich auch regelmäßig. Auch in diesem Fall.
Allerdings bin ich in diesem Fall partout nicht darauf gekommen, dass X etwas mit der Länge des Strings zu tun haben könnte. Ich wollte ja nur ein Zeichen kopieren, und bei allen X über 2 kommt dann ja dasselbe raus. Da aber die Position von "=" in aLine größer als 2 ist, sah ich keinen Sinn darin das auszuprobieren.

@Alle:
Gibts nicht auch eine Kopiermethode, die so funktioniert, wie ich vermutete?

MFG

Komoluna

P.S.: Ich liebe dieses Forum, (fast) keiner, der einen anmeckert, das sei doch Pipifax, stattdessen freundliche und qualifizierte Antworten. Danke an alle in diesem Forum.
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Probleme bei Stringoperationen

Beitrag von ruewa »

Komoluna hat geschrieben:Ich dachte immer Copy währe von String S von Position A bis B
Okay, gegen falsch erinnern ist kaum ein Kraut gewachsen, außer eben einmal mehr in die Hilfe zu schauen, die Funktion heißt "Copy(s, Index, Count)"...
Komoluna hat geschrieben:Gibts nicht auch eine Kopiermethode, die so funktioniert, wie ich vermutete?
Das wäre ein bißchen zuviel Rauschen, denn eigentlich ist dafür nur eine einzeilige Umformung nötig:

Code: Alles auswählen

Function CopyFromTo(s: String; StartPos, EndPos: Integer): String;
begin
  Result := copy(s, StartPos, EndPos - StartPos + 1);
end;
Gruß Rüdiger

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Probleme bei Stringoperationen

Beitrag von Komoluna »

Das man sich so eine Funktion einfach selber machen kann weiß ich ja, aber nach dem es schon alle Methoden zu geben scheint, die man selber schreibt, dachte ich es müsste doch aus schon sowas wie CopyAB oder so in FPC/LCL geben
Komoluna hat geschrieben:@m.fuchs:
Die Funktion ExtractWord kannte ich noch garnicht. Hab dann ähnliches immer selber zusammengewürfelt. Danke für den Tipp.
Trotzdem danke,
ich glaube es sind alle Frage geklärt, danke euch beiden

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten