Seite 1 von 2
Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 14:42
von MightyMAC
Hallo liebe Community,
ich habe hier dieses Problem, welches mich an meinem Verstand zweifeln lässt. Ich habe folgenden Code:
Code: Alles auswählen
Procedure.d GetWholeHeight()
WholeHeight.d=0
ForEach TLine()
Height.d=GetLineHeight(ListIndex(TLine()))
WholeHeight+Height
Next
ProcedureReturn WholeHeight
EndProcedure
Der funktioniert jetzt so wie er ist. Wenn ich ihn allerdings so schreibe...
Code: Alles auswählen
Procedure.d GetWholeHeight()
WholeHeight.d=0
ForEach TLine()
WholeHeight+GetLineHeight(ListIndex(TLine()))
Next
ProcedureReturn WholeHeight
EndProcedure
...funktioniert er nicht mehr. Rückgabewert ist dann "NaN". Sollte aber funktionieren, oder?
Vor einem halben Jahr etwa hatte ich das selbe Phänomen bei einer Software, die seit 8 Jahren bei einem Unternehmen läuft. Von einem Tag auf den anderen wurde keine Schrift mehr angezeigt. Ich habe dann nach einigen Tests Inline-Berechnungen in verschiedene Variablen aufschlüsseln müssen, um diese dann zu für die Berechnungen zu nehmen. Musste dafür hunderte Codezeilen anfassen, die vorher jahrelang in Ordnung waren. Macht für mich bis heute keinen Sinn, damals war mir das aber zu umfangreich zu posten. Hier habe ich jetzt mal ein kleines Beispiel das man posten kann.
Hat jemand eine Idee, was hier falsch ist?
By the way: Windows 10 64bit und PB 5.62
Grüße
Marcus
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 15:21
von helpy
Hallo,
also bei mir gibt es dieses Problem nicht.
Ob ich nun Variante 1 verwende:
... oder Variante 2:
... ich habe bei mir immer dasselbe Ergebnis.
Um Deinen Code zu testen, muss man noch einiges rund herum schreiben!
Der ist alleine für sich nicht lauffähig.
Ich würde das auch komplett anders nachen.
1. EnableExplizit verwenden und jede Variable deklarieren, das erspart Dir bei komplexen Programmen die Fehlersuche bei Schreibfehlern!
2. Keine globalen Listen/Variablen verwenden, sondern z. B so:
Code: Alles auswählen
Procedure.d GetWholeHeight(List TLine.tType())
Protected WholeHeight.d
ForEach TLine()
WholeHeight + GetLineHeight(ListIndex(TLine()))
Next
ProcedureReturn WholeHeight
EndProcedure
Protected stellt sicher, dass die Variable WholeHeigt nur innerhalb der Prozedur gilt und mit Null initialisiert wird.
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 15:24
von mk-soft
Der code ist nicht ausführbar zum Testen...
Aber:
- EnableExplicit aufrufen
- Variablen in Prozeduren definieren. Kann sonst zu Type Fehlern führen wenn die Variable schon vorher verwendet wurde.
ListIndex verstehe ich nicht, was er da soll ...
Code: Alles auswählen
Procedure.d GetWholeHeight()
Protected WholeHeight.d, Height.d
ForEach TLine()
Height.d=GetLineHeight(ListIndex(TLine()))
WholeHeight+Height
Next
ProcedureReturn WholeHeight
EndProcedure
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 15:37
von MightyMAC
Okay, anders. Hier der komplette Code:
Code: Alles auswählen
Structure Char
Char.c
Font.i
Size.i
EndStructure
Structure Line
*StartChar.Char
EndStructure
Global Txt.s
Global NewList TChar.Char()
Global NewList TLine.Line()
Global DefaultSize=12
Global DefaultFont=LoadFont(#PB_Any,"Segoe UI",DefaultSize)
Procedure TextToCharList()
ClearList(TChar())
ClearList(TLine())
*Start=@Txt
*Current.Character=*Start
Index=1
Repeat
StartChar=0
While *Current\c<>10 And *Current\c
AddElement(TChar())
TChar()\Char=*Current\c
*Current+SizeOf(Character)
Index+1
If StartChar=0
StartChar=@TChar()
EndIf
Wend
If *Current\c
AddElement(TChar())
TChar()\Char=*Current\c
*Current+SizeOf(Character)
Index+1
EndIf
AddElement(TLine())
TLine()\StartChar=StartChar
Until *Current\c=0
EndProcedure
Procedure.s GetLineText(Num)
SelectElement(TLine(),Num)
ChangeCurrentElement(TChar(),TLine()\StartChar)
While TChar()\Char<>10
Text.s+Chr(TChar()\Char)
If NextElement(TChar())=0
Break
EndIf
Wend
ProcedureReturn Text
EndProcedure
Procedure.d GetLineHeight(Num)
PushListPosition(TLine())
SelectElement(TLine(),Num)
ChangeCurrentElement(TChar(),TLine()\StartChar)
Height.d=0
While TChar()\Char<>10
; Set font size
If TChar()\Size<>0
CurrentSize.d=TChar()\Size
Else
CurrentSize.d=DefaultSize
EndIf
; Set font
If TChar()\Font<>0
VectorFont(FontID(TChar()\Font),CurrentSize)
Else
VectorFont(FontID(DefaultFont),CurrentSize)
EndIf
CurrentHeight.d=VectorTextHeight(Chr(TChar()\Char))
If CurrentHeight>Height
Height=CurrentHeight
EndIf
If NextElement(TChar())=0
Break
EndIf
Wend
PopListPosition(TLine())
ProcedureReturn Height
EndProcedure
; Procedure.d GetWholeHeight()
; WholeHeight.d=0
; ForEach TLine()
; Height.d=GetLineHeight(ListIndex(TLine()))
; WholeHeight+Height
; Next
; ProcedureReturn WholeHeight
; EndProcedure
Procedure.d GetWholeHeight()
WholeHeight.d=0
ForEach TLine()
WholeHeight+GetLineHeight(ListIndex(TLine()))
Next
ProcedureReturn WholeHeight
EndProcedure
For t=0 To 2999
Txt.s+"Dies ist eine Textzeile (Nr. "+Str(t)+"). Sie ist etwas länger um Zeilenumbruch vernünftig testen zu können."+Chr(10)
Next
Debug "Starte Listenerstellung"
StartTime=ElapsedMilliseconds()
TextToCharList()
Debug "Zeit="+Str((ElapsedMilliseconds()-StartTime)/1000)+"sek."
Debug "Anzahl Zeichen="+ListSize(TChar())
Debug "Anzahl Zeilen="+ListSize(TLine())
Debug " "
For t=0 To 9
Debug GetLineText(t)
Next
OpenWindow(0,0,0,500,300,"Test")
CanvasGadget(0,0,0,500,300)
StartVectorDrawing(CanvasVectorOutput(0))
Debug "WholeHeight="+GetWholeHeight()
StopVectorDrawing()
Würdet ihr mal die beiden Procedures "GetWholeHeight()" im Vergleich testen, bitte?
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 15:43
von helpy
Beide liefern bei mir dasselbe Ergebnis!
Getestet mit PureBasic 5.72 x64
... aaaah ... Du hast 5.62 ... müsste ich jetzt zum Testen extra installieren.
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 15:54
von MightyMAC
Ich glaube das brauchst du nicht extra machen. Ich habe es auch mit 5.46 und 5.70 getestet. Alles das gleiche...
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 15:58
von helpy
Bereits passiert
Windows 10 Pro // PureBasic 5.62 x64
Beide Male dasselbe Ergebnis:
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 15:59
von helpy
Welche Compiler-Einstellungen?
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 16:25
von NicTheQuick
Bei mir kommt beide male 45000 heraus. Allerdings ist das Fenster halt nur weiß und blinkt eigentlich nur kurz auf, weil die komplette Eventschleife fehlt und keinerlei Events abgearbeitet werden können.
Re: Inline-Berechnungen funktionieren nicht (mehr)
Verfasst: 09.04.2020 16:43
von MightyMAC
Ist richtig, ich mache nur ein Canvas auf um "VectorTextHeight" benutzen zu können. Deswegen keine Eventschleife, etc.
Ich habe es jetzt auf drei Rechnern mit verschiedenen PB Versionen ausprobiert und erhalte immer dasselbe Ergebnis. Compilereinstellungen sind Standard.
Als ich dieses Ding vor einem halben Jahr hatte, funktionierte von jetzt auf gleich das Tool bei ca. 500 von ca. 800 Benutzern nicht mehr. Ich hatte zuerst ein Windows-Update (ich glaube 1803) im Auge, das hat sich aber am Ende nicht bestätigt. Erst als ich von Inline-Berechnungen auf Einzel-Variablen umgebaut hatte lief es bei allen wieder.
Ich bin ratlos.
EDIT: Ich habe jetzt gerade PB 5.72 64-bit installiert. Hier funktioniert es ohne Probleme. D.h. das Problem tritt bei allen 32-bit Versionen auf. Das sollte es aber nicht, oder?