[Bug!][fixed!] bei Procedurereturn/If/newlist

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

[Bug!][fixed!] bei Procedurereturn/If/newlist

Beitrag von Toshy »

Hallo.

Meine Debugausgabe sieht so aus:
Ergebnis=999
dbRam_Pack()=6749696
Wie kann das bei dem Code sein (Beta4 und 3)

Code: Alles auswählen

OpenConsole()
Procedure error(l.l,s.s)
EndProcedure
#DBMemoryIdControl = 0
#PointerValueTypDbHeader = 0
#PointerValueTypPos = 0
#DBColumnCount = 0
#DBRowCount = 0
#DBColumnPosID = 0
#DBColumnHeaderID=0
#DBRowHeaderID =0
#ColumnHeaderWidth  =0
#ColumnDataBlockWidth =0
#ColumnType=0
#VarString =0
#VarFixedString =0
#VarCharAscii =0
#VarCharUnicode =0
#VarMemo =0
#RowHeaderWidth=0
#VarData =0
#RowDataBlockWidth=0
#RowHeaderRowID=0
#RowHeader2LoeschFlag=0
#RowHeader2UserFlag=0
#RowHeader2Width=0
#ecNoColumnExist=0
#ecDbNotExist=0

Procedure.l dbRam_Pack(*DbMemoryID)
   Ergebnis.l
   If 0
      ;PB_EnterCS(RAMDB,0,0)
      If *DbMemoryID <> 0 And (PeekL(*DbMemoryID+#DBMemoryIdControl) = *DbMemoryID  ) And (PeekB(*DbMemoryID+#PointerValueTypPos) = #PointerValueTypDbHeader)
         RowCounter.l
         ColumnCount             = PeekL(*DbMemoryID+#DBColumnCount)
         RowCount.l                = PeekL(*DbMemoryID+#DBRowCount)    ; Anzahl Zeilen  = Long
         *ColumnHeader           = PeekL(*DbMemoryID+#DBColumnHeaderID)
         *RowHeader = PeekL(*DbMemoryID+#DBRowHeaderID)    ; MemPointer zu Daten Zeilenheader = *Long
         *DBColumnPos = PeekL(*DbMemoryID+#DBColumnPosID)
         If ColumnCount > 0
            NewList PointerPosition.l()
            For CC = 1 To ColumnCount
               ColumnType = PeekB(*ColumnHeader+#ColumnHeaderWidth +((CC-1)*#ColumnDataBlockWidth)+#ColumnType)
If (ColumnType =#VarString) Or (ColumnType =#VarFixedString) Or (ColumnType =#VarCharAscii) Or (ColumnType =#VarCharUnicode) Or (ColumnType =#VarData ) Or (ColumnType =#VarMemo)
                  AddElement(PointerPosition())
                  PointerPosition() = PeekL(*DBColumnPos+(4*CC))
               EndIf
            Next CC
            *DBColumnPos = PeekL(*DbMemoryID+#DBColumnPosID)
            dbPackCounter.l
            While RowCounter < RowCount
               RowCounter + 1
               *Row = PeekL(*RowHeader+#RowHeaderWidth+((RowCounter-1)*#RowDataBlockWidth)+#RowHeaderRowID) ;*Row
               If PeekB(*Row+#RowHeader2LoeschFlag) > 0
                  If PeekL(*Row + #RowHeader2UserFlag) = 0
                     If CountList(PointerPosition())  > 0
                        ResetList(PointerPosition())
                        ForEach PointerPosition()
                           NextElement(PointerPosition())
                           *Pointer = PeekL(*Row+#RowHeader2Width+PointerPosition())
                           If *Pointer > 0
                              FreeMemory(*Pointer)
                           EndIf
                        Next
                     EndIf
                     FreeMemory(*Row)
                     dbPackCounter + 1
                     
                     If RowCount > 0 ; RowHeader-Daten aktualisieren
                        ;MoveMemory(*SourceMemoryID, *DestinationMemoryID, Length)
                        *SourceMemoryID = *RowHeader+#RowHeaderWidth+(RowCounter*#RowDataBlockWidth)
                        *DestinationMemoryID = *RowHeader+#RowHeaderWidth+((RowCounter-1)*#RowDataBlockWidth)
                        Length.l = (RowCount-1)*#RowDataBlockWidth
                        MoveMemory(*SourceMemoryID, *DestinationMemoryID, Length)
                     EndIf
                     
                     RowCount - 1 ; Zhler um EINS zurckzhlen, da EIN Eintrag gelscht wurde
                     RowCounter - 1 ; Zhler um EINS zurckzhlen, da EIN Eintrag gelscht wurde
                     PokeL(*DbMemoryID+#DBRowCount, RowCount) ;dbHeader aktualisieren
                     
                  EndIf
               EndIf
            Wend
            Ergebnis = dbPackCounter
         Else : Ergebnis = #ecNoColumnExist
         EndIf
      Else : Ergebnis = #ecDbNotExist : error(1,Str(#ecDbNotExist)+"#dbRam_select() - Datenbank existiert nicht")
      EndIf
      ;PB_LeaveCS(RAMDB) 
   EndIf
   Ergebnis = 999
   Debug "Ergebnis="+Str(Ergebnis)
   ProcedureReturn Ergebnis
EndProcedure


     dbRam_Pack = dbRam_Pack(*DBid)
   Debug "dbRam_Pack()=" +Str( dbRam_Pack )
Das dürfte doch unmöglich sein. Die Procedure wird anfangs angewiesen ein Long zurück zugeben, ein long wird "declariert" (ergebnis.l), es wird fest (nur zum test) der wert 999 zugewiesen, die gebugausgabe stimmt, aber die debugausgabe des Wertes der durch die Procedure zurück gegeben wird stimmt damit nicht überein. wie kommt das?
Kürze ich die procedure um den "If-Teil", so stimmt es wieder. Der If-Teil aber wird ja nicht ausgeführt.

[edit]
Tritt der Fehler bei euch eigendlich auch auf?

Toshy
Zuletzt geändert von Toshy am 28.02.2006 17:58, insgesamt 2-mal geändert.
1. Win10
PB6.1
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Ich hab mal mit 3.94 getestet, und bin darauf gestoßen, dass MoveMemory()
nicht existiert,
also habe ich es in

Code: Alles auswählen

CopyMemory(*SourceMemoryID, *DestinationMemoryID, Length)
FreeMemory(*SourceMemoryID)
umgewandelt, und so funktionierts perfekt.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Hi.

erstens muß ich MoveMemory nutzen,
zweitens tritt der Fehler auch mit copymemroy auf,
dritten, der code wird GAR NICHT ausgeführt, da er durch "if 0" die Ausführung verhindert wird.

schreibe ich ProcedureReturn 999 kommt es zu selben fehler, was ja nicht sein dürfte.

Mit 3.94 teste ich natürlich diesen Code nicht mehr, aber gut zu wissen, das es da klappt. werde es gleich auch mal testen. Dann wird da also wohl ein Bug vorhanden sein. Leider kann man den wohl nicht umgehen.
1. Win10
PB6.1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Habs zwar nicht verstanden, sehe auch keinen Fehler :freak:
Debugger PB4B4 hat geschrieben:Ergebnis=999
dbRam_Pack()=1245064
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Eine Bestätigung habe ich dann schon mal. Und unter 3.94 läuft es auch. Also wohl ein Bug.
Aber leider wohle ohne Möglichkeit eines Workaround.
Woran das liegen mag kann ich natürlich nicht sagen, da es ja total unlogisch ist, oder wohl eher logisch (nur verstehe ich es nicht ;-)

[edit]
Im englischen Forum wurde bestätigt, das es ein Bug ist.
http://forums.purebasic.com/english/vie ... 214#129214

"Newlist" löst wohl einen Fehler aus.
1. Win10
PB6.1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hätteste versucht, Deinen Source auf ein reproduzierbares Minimum zu
reduzieren, hätteste den Bug auch selber gefunden.

Workaround:
Kein NewList in If.. Else usw. oder warten auf die nächste Beta :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Der Code war absolut nachvollziehbar. Schließlich konnte sofort nach dem Start jeder den Fehler reproduzieren. Da ich vorhin aber noch was anderes wichtiges machen mußt und ich den Bug heute noch bestätigt oder wiederlegt haben wollte / mußte habe ich das halt gepostet.
Das einzige was ich noch nicht ganz geschafft hatte war den Bug genau zu finden. Immerhin habe ich 4-6 Stunden nur damit verbracht rauszufinden wo der Fehler ist und dann ca. 3000 Zeilen aus der originalen Procedure gestrichen.

Diesen Fehler überhaupt in der Procedure zu lokalisieren fand ich grausam schwer (und ich finde meine Fehler oder Bug eigendlich immer recht schnell -> liegt an meiner Programmstruktur), denn die Procedure selbst war ja total Fehlerfrei, was mir auch das Debug vor dem Procedurereturn anzeigte. Das dann ein anderer Wert übergeben wird viel natürlich nicht gleich auf.

Habe ich halt ein neues graues Haar ;-)

Also es war schon einige Arbeit die Procedure ohne mein Programm zum läufen zu bekommen und damit einzugrenzen.
Jetzt aber wissen wir das es ein Bug ist, na ja, vielleicht sagt uns Fred ja noch, daß es eine neue Funktion ist. Die "IchMachEuchIrre"-Funktion ;-)

Dumm das es keinen wirklichen Workaround gibt. Außerhalb der If-Struktur und sogar ganz ohne "If" tritt der Fehler auch auf. Ich mache es jetzt vorläufig mit einer Globalen Liste, was aber nur zum testen einiger untercodes hilfreich ist. Da ich mit Threads arbeite klappt das mit der Globalen nicht im Ganzen.

Gruß und Danke
Thorsten
1. Win10
PB6.1
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Habe ich mir mal angeschaut. Wenn der Code Auskommentiert ist kommt das richtige ergebnis. Wenn mit "If 0" eingebunden ist kommt das falsche ergebnis.
Bestätige damit den Bug.

Weiter Beta Testen.
Freue mich schon auf die Relaise

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@mk-soft
Der Fehler ist viel schlimmer, wie wir inzwischen festgestellt haben.
Jedes NewList in einer Procedure verfälscht das Rückgabeergebnis, jedenfalls
bei Long.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Tja, dann will ich nochmal einen drauf setzen.
Gestern haben wir unter
http://forums.purebasic.com/german/viewtopic.php?t=7148
festgestellt, daß es auch Rückgabefehler OHNE newlist geben kann.
Da sind wohl noch ein paar klitzekleine Käfer drinn.
1. Win10
PB6.1
Antworten