Fehlermeldung: fpc_shortstr_to_ansistr[gelöst] (32)
-
- Beiträge: 188
- 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)
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
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- 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)
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).
-
- Beiträge: 188
- 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)
Hallo af0815
Stacktrace, Stackfenster Ist das der Aufrufstack? Gut da schau ich dann beim nächsten mal nach!
Stacktrace, Stackfenster Ist das der Aufrufstack? Gut da schau ich dann beim nächsten mal nach!
-
- 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)
Hast du vielleicht ausversehen die {$H+} Zeile gelöscht?
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
-
- Beiträge: 188
- 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)
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?
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?
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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)
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.
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.
-
- Beiträge: 188
- 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)
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
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
-
- 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)
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);
-
- Beiträge: 188
- 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)
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 ?
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 ?
-
- 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)
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 müsstest du nur bei PAnsiChar, PWideChar u.ä. machen.
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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)
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.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.
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.
-
- Beiträge: 188
- 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)
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
Mal sehen.
ich kämpfe momentan allerdings auf einer anderen Baustelle.
Ich komme aber darauf zurück.
Gruß Fritz
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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)
Bei {$H+} sind alle Stringvariablen die einfach nur als string deklariert sind automatisch Ansistrings. Bei {$H-} sind sie automatisch ShortStrings.haderlump hat geschrieben:Damit müssten ja alle string-Variablen im Programm automatisch Ansistrings sein.
Nur wenn sie explizit als Shortstring oder Ansistring delariert sind, hat für diese Variablen die Einstellung von {$H+/-} keine Bedeutung.
-
- Beiträge: 188
- 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)
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.
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.
-
- Beiträge: 188
- 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)
Wie es scheint, ist das problem gelöst. Wenigstens trat der fehler nicht mehr auf.