Inline-Berechnungen funktionieren nicht (mehr)

Anfängerfragen zum Programmieren mit PureBasic.
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Inline-Berechnungen funktionieren nicht (mehr)

Beitrag 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
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag von helpy »

Hallo,
also bei mir gibt es dieses Problem nicht.

Ob ich nun Variante 1 verwende:

Code: Alles auswählen

Height = x()
WhoelHeight + Height
... oder Variante 2:

Code: Alles auswählen

WholeHeigt + x()
... 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.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag 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?
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag 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.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag von MightyMAC »

Ich glaube das brauchst du nicht extra machen. Ich habe es auch mit 5.46 und 5.70 getestet. Alles das gleiche...
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag von helpy »

Bereits passiert ;-)
Windows 10 Pro // PureBasic 5.62 x64

Beide Male dasselbe Ergebnis:

Code: Alles auswählen

WholeHeight=47882.8125
WholeHeight=47882.8125
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag von helpy »

Welche Compiler-Einstellungen?
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag 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.
Bild
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: Inline-Berechnungen funktionieren nicht (mehr)

Beitrag 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?
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Antworten