Aktuelle Zeit: 24.09.2020 17:49

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 14:42 
Offline

Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Hallo liebe Community,

ich habe hier dieses Problem, welches mich an meinem Verstand zweifeln lässt. Ich habe folgenden Code:
Code:
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 15:21 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:29
Hallo,
also bei mir gibt es dieses Problem nicht.

Ob ich nun Variante 1 verwende:
Code:
Height = x()
WhoelHeight + Height
... oder Variante 2:
Code:
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:
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 15:24 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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:
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 / OPC-Helper DLL
PB v3.30 / v5.7x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 15:37 
Offline

Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Okay, anders. Hier der komplette Code:
Code:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 15:43 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:29
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 15:54 
Offline

Registriert: 07.01.2007 18:11
Wohnort: Duisburg
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 15:58 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:29
Bereits passiert ;-)
Windows 10 Pro // PureBasic 5.62 x64

Beide Male dasselbe Ergebnis:
Code:
WholeHeight=47882.8125
WholeHeight=47882.8125

_________________
Windows 10
PB Last Final / (Sometimes testing Beta versions)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 15:59 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:29
Welche Compiler-Einstellungen?

_________________
Windows 10
PB Last Final / (Sometimes testing Beta versions)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 16:25 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-Berechnungen funktionieren nicht (mehr)
BeitragVerfasst: 09.04.2020 16:43 
Offline

Registriert: 07.01.2007 18:11
Wohnort: Duisburg
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye