pos() hängt sich bei einer Array auf

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

pos() hängt sich bei einer Array auf

Beitrag von Mathias »

Code: Alles auswählen

var ba: array of Integer = (1, 2, 3, 4, 5, 6, 7, 8, 9);
begin
  WriteLn('pos: ', pos('bc', 'abcdef'));
  WriteLn('pos: ', pos([1, 2], ba));
  WriteLn('Ende');
end.  
Beim String funktioniert es noch wie erwartet.

Ich bekomme folgende Ausgabe:

Code: Alles auswählen

 ./project1
pos: 2
pos: 
"Ende" wird gar nicht mehr ausgegeben.

Mache ich das ganze in einer LCL-Anwendung, bekomme ich folgender Hinweis, sieht Anhang.

Wieso lässt sich dies überhaupt kompilieren ?
Dateianhänge
Bildschirmfoto vom 2023-09-30 16-26-14.png
Bildschirmfoto vom 2023-09-30 16-26-14.png (12.89 KiB) 4427 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

ArchChem
Beiträge: 83
Registriert: Mo 11. Jul 2022, 10:41

Re: pos() hängt sich bei einer Array auf

Beitrag von ArchChem »

Was bedeutet, du machst das mit der LCL? Gibst du das ganze auf einem Label oder ähnliches aus? Dann musst den Integer in einen String konvertieren.

Code: Alles auswählen

Label1.Caption := IntToStr(Pos(...));
Falls dies das Problem nicht löst, dann poste am besten mal deinen Code :-)

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

Re: pos() hängt sich bei einer Array auf

Beitrag von theo »

Man kann sich fragen warum das kompiliert.
Man kann sich aber auch fragen, wie du auf die Idee kommst, dass sich Pos auf ein Integer Array anwenden lässt.
https://www.freepascal.org/docs-html/rt ... m/pos.html

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: pos() hängt sich bei einer Array auf

Beitrag von Mathias »

Man kann sich aber auch fragen, wie du auf die Idee kommst, dass sich Pos auf ein Integer Array anwenden lässt.
Wen man zB. in einer Binär-Datei/Stream eine Zeichenfolge sucht.
Gut, Integer ist etwas blöd, aber der gleiche Effekt tritt auch mit "array of Byte" auf.

Mit "array of char" fast das gleiche Problem.

Hier der gleiche Hänger, wie bei Byte oder Integer:

Code: Alles auswählen

var ca: array of char = ('a', 'b', 'c', 'e', 'd');  WriteLn('pos: ', pos('bc', ca));
Mache ich es gleich mit den Klammern wie bei Byte/Integer, dann motzt der Compiler.

Code: Alles auswählen

  WriteLn('pos: ', pos(['b', 'c'], ca));


Was bedeutet, du machst das mit der LCL? Gibst du das ganze auf einem Label oder ähnliches aus? Dann musst den Integer in einen String konvertieren.
Dies ist mir schon klar, ich wollte nur sehen, wie es in einer LCL-Anwendung reagiert, da bei der reinen Konsolen-Anwendung kein Fehler ausgespuckt wurde.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: pos() hängt sich bei einer Array auf

Beitrag von Warf »

Vermutlich wird der Array zu Variant gecastet und wenn Pos dann den String aus dem Variant auslesen will krachts weil der Variant nie ein String war.

Einer der Gründe warum variants fast immer schlechte Idee sind.

Warum das bei der LCL ne Meldung wirft bei einer Konsolenanwendung nicht ist auch einfach, jede LCL Anwendung hat einen exception handler der dann eine Fehlermeldung wirft. Konsolenanwendungrn muss man exceptions selbst handlen. Wenn man das nichta hat schmiert einfach die Anwendung ohne Meldung ab (mit Return Code 203 glaube ich)

Antworten