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?