LocTeiler := <variable aus record> LocResult :=(LocMultiplicator*100)/ LocTeiler;
kriege ich ein SIGPFE Fehler beim kompilieren. Es ist ein Integer Wert in einem Record duch den geteilt werden soll. Durch andere Variablen (nicht aus record) kann ich dividieren.
Das Problem habe ich nur mit der 1.8.4 Version unter win7. Unter XP mit der Version 1.6.4 habe ich das Problem nicht. Muss man da was konfigurieren in 1.8.4?
Zuletzt geändert von Marc am Do 9. Aug 2018, 23:53, insgesamt 1-mal geändert.
Good code comes from experience, experience comes from bad code.
Marc hat geschrieben:kriege ich ein SIGPFE Fehler beim kompilieren.
Beim kompilieren? Also knallt fpc.exe mit der SIGPFE? Oder meinst du du bekommst den Fehler beim Ausführen/Debuggen. Für den ersten Fall, herzlichen glückwunsch du hast einen breaking bug im FPC gefunden musst ihn nur noch profilen und einen Bugreport einreichen (das ist easy für einen SIGFPE), für den zweiten Fall, PFE ist ein Arithmetischer Fehler, wahrscheinlich divide by zero. Andere tolle alternativen sind, eine der Zahlen ist NaN (Not a Number) oder du jonglierst mit infinity.
Ansonsten gibt dir beide seiten der Division einfach mal mit ShowMessage oder WriteLn aus
Marc hat geschrieben:Danke für die Antworten. Das passiert beim compilieren. [...] Nätürlich könnte die Variable null annehmen. Das tut sie aber nicht. Und eben, in der alten Version 1.6.4 gehen beide Varianten.
Wenn es beim Kompilieren geschieht ist das ein Fehler des FPC's. 1.8.4 verwendet soweit ich weiß die aktuellste FPC version (3.0.4), da wäre es Interresant zu wissen ob der Fehler auch im trunk ist und einen Bugreport einzureichen. Dann am besten versuchen den Fehler zu isolieren (ein minimal beispiel finden) und falls das nicht möglich sein sollte (was sehr gut sein kann da breaking bugs meißt in extrem seltene situationen auftreten) und du dein Projekt nicht komplett teilen möchtest/kannst kannst du versuchen den Fehler selbst zu lokalisieren (fpc als debug build compilen, im gdb die SIGPFE finden und den backtrace sowie die lokalen variablen ausgeben lassen) und das dann als Bugreport zu senden.
Ich denke mal wenn es ein breaking bug ist wird dir hier sonst keine groß helfen können. Versuch eventuell mal andere FPC versionen (einfach auf freepascal.org runterladen und in den Lazarus einstellungen unter Compilerpfade den neuen pfad angeben). Eventuell reicht es auch schon die Optimierungsstufe zu ändern, kann aber praktisch alles sein.
Also, von einem FPC-Bug zu reden, erscheint mir bei so einfachen Operationen und so einfachen Zahlen weit hergeholt. Sowas hätte schon lange jemand gefunden.
Wie so oft, kann man mit den Angaben nichts anfangen. Du sagst, dass der folgende Code beim Kompilieren abbricht, sagst aber nicht, was sich hinter LibDat, LibDat.Data, LibDat.Data.NrOfWrong verbirgt.
program Project1; type TData =record NrOfWrong:array[0..4]ofInteger; end; TLibData =record Data:array[0..4445]of TData; end;
var LibDat:array[0..1]of TLibData; LocTeiler:Integer; LocResult: Double;
begin LibDat[1].Data[4445].NrOfWrong[4]:=5; LocTeiler := LibDat[1].Data[4445].NrOfWrong[4]; LocResult :=100/ LocTeiler;
WriteLn(LocResult); ReadLn; end.
Kein Problem beim Kompilieren, und zur Laufzeit auch nicht. Letztendlich wird ja nur 100 durch 5 dividiert. Wenn das der FPC nicht kann!
Wahrscheinlich liegt das Problem an den Datenstrukturen, denn das was ich mir oben aus der Kristallkugel gesaugt habe, hat wahrscheinlich nichts mit deinen Vorgaben zu tun. Poste, was hinter den Records sonst noch alles steckt. Wenn da noch ein Array[0..100000000000, 0..10000000000] of integer irgendwo eingebaut ist, dann wundert mich nicht, dass FPC aufmuckt.
wp_xyz hat geschrieben:Also, von einem FPC-Bug zu reden, erscheint mir bei so einfachen Operationen und so einfachen Zahlen weit hergeholt. Sowas hätte schon lange jemand gefunden.
Ein SIGPFE ist bei dir kein bug? Meine vorstellung von einem bug ist ein Fehler der nicht abgefangen/behandelt wird. Und da die SIGPFE meldung rausgeht scheint mir das nicht behandelt. (Der FPC ist zwar nicht so verbos, aber normalerweise doch detailierter als das)
Und das sowas schon lange gefunden würde ist auch falsch. Ich arbeite an der Uni im bereich automatisiertes Testen und es kommt öfter vor das Breaking bugs gefunden werden selbst in so gut getesteten Programmen wie den coreutils (Klee OSDI paper hat mehrere Breaking bugs in der Coreutils und Busybox gefunden). Diese fehler sind so unfassbar selten, das man sehr spezielle setups braucht um sie zu triggern. Wahrscheinlich hatte Marc einfach extrem viel pech (oder glück, immerhin ist das finden von bugs ja was gutes da sie dann gefixt werdenkönnen). Kommt vor.
Poste doch einfach mal den compiler log von deinem projekt (also die letzen paar zeilen des Nachrichtenfensters wenn du versuchst zu kompilieren). Vielleicht steht ja irgendwas relevantes drin
Das habe ich im Nachrichtenfenster: Projekt kompilieren, OS: win32, CPU: i386, Ziel: BWord.exe: Erfolg, Hinweise: 54 lesson.pas(1142,3) Note: Local variable "MaxLinesCount" not used lesson.pas(1143,3) Note: Local variable "MaxRowsCount" not used lesson.pas(1150,18) Note: Local variable "NumberString" not used lesson.pas(1156,7) Note: Local variable "IsControlLine" not used lesson.pas(1159,5) Note: Local variable "TempInt" not used lesson.pas(1166,6) Note: Local variable "LocLevel2Nr" not used lesson.pas(1167,6) Note: Local variable "LocLevel2Val" not used lesson.pas(1171,6) Note: Local variable "PartRecordNr" is assigned but never used lesson.pas(1174,6) Note: Local variable "PartIdentNr" is assigned but never used lesson.pas(1176,6) Note: Local variable "PartVocNewDateTime" is assigned but never used lesson.pas(1177,6) Note: Local variable "PartCreateUserName" is assigned but never used lesson.pas(1181,6) Note: Local variable "PartVocChangeDateTime" is assigned but never used lesson.pas(1182,6) Note: Local variable "PartVocChangeUserName" is assigned but never used lesson.pas(1192,6) Note: Local variable "PartCodeInfo" is assigned but never used lesson.pas(1198,6) Note: Local variable "PartLevelDateTime" is assigned but never used lesson.pas(1817,3) Note: Local variable "LocVocIsInLoop" is assigned but never used lesson.pas(237,57) Hint: Parameter "UTF8Key" not used lesson.pas(238,57) Hint: Parameter "UTF8Key" not used lesson.pas(239,57) Hint: Parameter "UTF8Key" not used lesson.pas(240,57) Hint: Parameter "UTF8Key" not used lesson.pas(241,57) Hint: Parameter "UTF8Key" not used lesson.pas(242,57) Hint: Parameter "UTF8Key" not used lesson.pas(243,57) Hint: Parameter "UTF8Key" not used lesson.pas(244,57) Hint: Parameter "UTF8Key" not used lesson.pas(280,11) Hint: Parameter "UTF8Key" not used lesson.pas(282,11) Hint: Parameter "UTF8Key" not used lesson.pas(284,11) Hint: Parameter "UTF8Key" not used lesson.pas(286,11) Hint: Parameter "UTF8Key" not used lesson.pas(288,11) Hint: Parameter "UTF8Key" not used lesson.pas(290,11) Hint: Parameter "UTF8Key" not used lesson.pas(292,11) Hint: Parameter "UTF8Key" not used lesson.pas(294,11) Hint: Parameter "UTF8Key" not used lesson.pas(296,11) Hint: Parameter "UTF8Key" not used lesson.pas(298,11) Hint: Parameter "UTF8Key" not used lesson.pas(300,11) Hint: Parameter "UTF8Key" not used lesson.pas(302,11) Hint: Parameter "UTF8Key" not used lesson.pas(304,11) Hint: Parameter "UTF8Key" not used lesson.pas(306,11) Hint: Parameter "UTF8Key" not used lesson.pas(308,11) Hint: Parameter "UTF8Key" not used lesson.pas(310,11) Hint: Parameter "UTF8Key" not used lesson.pas(249,58) Hint: Parameter "UTF8Key" not used lesson.pas(250,63) Hint: Parameter "UTF8Key" not used lesson.pas(252,63) Hint: Parameter "UTF8Key" not used lesson.pas(254,63) Hint: Parameter "UTF8Key" not used lesson.pas(256,63) Hint: Parameter "UTF8Key" not used lesson.pas(258,63) Hint: Parameter "UTF8Key" not used lesson.pas(260,63) Hint: Parameter "UTF8Key" not used lesson.pas(262,63) Hint: Parameter "UTF8Key" not used lesson.pas(265,63) Hint: Parameter "UTF8Key" not used lesson.pas(315,51) Hint: Parameter "CanClose" not used lesson.pas(320,57) Hint: Parameter "MousePos" not used lesson.pas(321,11) Hint: Parameter "Handled" not used lesson.pas(361,59) Hint: Parameter "MousePos" not used lesson.pas(361,80) Hint: Parameter "Handled" not used
Good code comes from experience, experience comes from bad code.
Ja das ist so. Ich habe Windows7 und XP jeweils in einer Virtual box. Das auf einem Linux Mint. Beide Windows greifen auf das selbe Datenverzeichniss zu das von Linux zur Verfügung ist. Normal probiere ich alles in Windows 7. Wenn nötig kann ich einen Code dann auch mit XP compilieren. Ist das nicht gut? Das mit dem PI weiss ich. Hätte es rauslöschen sollen, verwirrt nur. Mein Code ist immer irgendwie copy & paste. Will meinem Progrämmchen später noch ein paar Geräusche beibringen, aber das hat noch Zeit.
Sind meine Variablen totaler Schrott oder müsste das funktionieren? Ist so einfach wie möglich. Bin auch ständig was am ändern daran.
Good code comes from experience, experience comes from bad code.