Fehlermeldung: fpc_shortstr_to_ansistr[gelöst] (32)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Fehlermeldung: fpc_shortstr_to_ansistr[gelöst] (32)

Beitrag von haderlump »

hallo zusammen
Ich bin recht am verzweifeln. Haus heiterem Himmel kommt eine Exception.
wenn ich dann draufklicke erscheint das Assemblerfenster und die Funktion fpc_shortstr_to_ansistr (32),
ist also wohl irgend eine Typumwandlung.
Leider gibt es keine Programmzeilennummer dazu . wie könnte ein pascal-befehl ausschauen, der diese Funktion aufruft ?

Gruß Fritz
Zuletzt geändert von haderlump am Fr 8. Feb 2019, 19:57, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von af0815 »

Zeigt der Stacktrace nichts ? Bzw. das Stackfenster ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von haderlump »

Hallo af0815
Stacktrace, Stackfenster Ist das der Aufrufstack? Gut da schau ich dann beim nächsten mal nach!

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von compmgmt »

Hast du vielleicht ausversehen die {$H+} Zeile gelöscht?

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von haderlump »

Der Aufrufstack gibt leider auch nichts her, meistens unverständliche Adressbezeichnungen.
compmgmt:
Ich hatte bei einer Unit wohl die besagte Zeile gelöscht, oder auch nicht? war auf jeden Fall nicht vorhanden.
Ich habe sie aber nachgetragen.
Die Fehler sind jetzt aber seltener.
Was ist eigentlich der Unterschied zwischen Short- und Ansistring. Vielleicht kann ich dieser Wandlung aus dem Weg gehen?

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von fliegermichl »

Shortstrings wurden in Turbo Pascal verwendet. Sie belegen immer 256 Bytes Speicherplatz. Im ersten Byte ist die Länge des Strings gespeichert. Nutzbare Stringlänge ist somit maximal 255 Zeichen.
AnsiStrings sind als Zeiger auf einen Speicherbereich definiert.

Sie belegen soviel Speicher wie man entweder mit SetLength festgelegt hat oder durch Angabe eines Literals wird das vom Compiler erledigt.
Zusätzlich belegen AnsiStrings 4 weitere Bytes die vor dem Beginn der eigentlichen Nutzdaten gespeichert werden und die aktuelle Länge des Strings beinhalten.

Die maximale Größe der Nutzdaten ist ca. 4 Gigabyte.

Die wurden soweit ich mich erinnere mit Delphi 2 eingeführt.
Als normaler Anwendungsprogrammierer merkt man den Unterschied erst mal gar nicht sonderlich weil der Compiler die Speicherverwaltung der Strings automatisch erledigt.

Shortstrings haben den Vorteil, daß man sie in records verwenden kann und mit Read und Write File of record direkt lesen und schreiben kann. Das geht mit Ansistrings nicht weil sie ja eigentlich Zeiger sind.
Vorteil ist natürlich aber, daß sie nur soviel Speicher verbrauchen wie nötig und wesentlich größere Zeichenmengen aufnehmen können.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von haderlump »

Hallo
wenn ich das richtig verstanden habe, weist {$H+} den compiler an ansi-strings zu verwenden.
Ich habe in meinem Programm ja nur kurze strings. Da würde Shortstring locker reichen.
Wenn ich {$H+} weglassen würde ginge dann trotzdem alles, oder werden die Ansi-Strings woanders gebraucht?

Mein Fehler tritt ja nur selten auf, und ich komme nicht dahinter, bei welcher Gelegenheit.

Es ist zum Haare raufen.
Ein Folgeproblem ist ja, dass da Züge fahren, und die machen bei einem Programmabsturz was sie wollen. Fahren also einfach weiter. Die Gleisbelegung und alles andre wird ja auch nicht mehr aktualisiert.
So genug gejammert!!!

Grß Fritz

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von compmgmt »

Theoretisch ja, ist aber unnötig. Nutz lieber direkt AnsiStrings. Hier mal ein Überblick über sämtliche Stringtypen: http://wiki.freepascal.org/Character_and_string_types/de#ShortString

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von haderlump »

In der Doku, auf die du verwiesen hast steht als typ ansistring. Das meinte ich dass ich dies Deklarationen umändere.
Da Ansistrings ja Zeiger sind, muss ich aber dann auch meine Records und Arrays abändern, oder passiert das automatisch wenn ich die Typen in ansistring ändere?
Und wenn ich Inhalte von Ansistrings auf Platte speichere muss ich dies ja dereferenzieren ?

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von compmgmt »

Nein da musst du nichts ändern. Das ist ja das schöne an den Pascal-Strings, dass sie alle gemanaged sind.

Das müsstest du nur bei PAnsiChar, PWideChar u.ä. machen.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von fliegermichl »

compmgmt hat geschrieben:Nein da musst du nichts ändern. Das ist ja das schöne an den Pascal-Strings, dass sie alle gemanaged sind.

Das müsstest du nur bei PAnsiChar, PWideChar u.ä. machen.


Das stimmt nur zum Teil. Wenn du die records in Dateien vom Typ file of xyrecord schreiben/lesen willst, dann geht das mit Ansistrings nicht.

Die Option {$H+} wirkt sich nur auf Strings aus die mit var xy : string; deklariert sind.
Wenn du var xy : Ansistring; oder var xy : Shortstring; deklarierst, hat der Switch keine Wirkung.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von haderlump »

Damit müssten ja alle string-Variablen im Programm automatisch Ansistrings sein.
Mal sehen.
ich kämpfe momentan allerdings auf einer anderen Baustelle.
Ich komme aber darauf zurück.

Gruß Fritz

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von fliegermichl »

haderlump hat geschrieben:Damit müssten ja alle string-Variablen im Programm automatisch Ansistrings sein.


Bei {$H+} sind alle Stringvariablen die einfach nur als string deklariert sind automatisch Ansistrings. Bei {$H-} sind sie automatisch ShortStrings.
Nur wenn sie explizit als Shortstring oder Ansistring delariert sind, hat für diese Variablen die Einstellung von {$H+/-} keine Bedeutung.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung: fpc_shortstr_to_ansistr (32)

Beitrag von haderlump »

Ich habe in allen meinem Modulen die {$H+} option eingetragen. Normalerweise gäbe es da nichts mehr zu wandeln.Trotzdem taucht die Fehlermeldung immer wieder mal auf.
Eigentlich würde mir shortstring überall reichen.
Wäre vieleicht die Option {$H-} die bessere Wahl, so dass die Umwandlung überflüssig wäre.

Ich kann auch nicht feststellen, von wo aus die Wandlung aufgerufen wurde. Der Aufrufstack liefert nichts verwerbares.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung: fpc_shortstr_to_ansistr[gelöst] (32)

Beitrag von haderlump »

Wie es scheint, ist das problem gelöst. Wenigstens trat der fehler nicht mehr auf.

Antworten