[Bug!][fixed!] bei Procedurereturn/If/newlist
Verfasst: 26.02.2006 22:08
Hallo.
Meine Debugausgabe sieht so aus:
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
Meine Debugausgabe sieht so aus:
Wie kann das bei dem Code sein (Beta4 und 3)Ergebnis=999
dbRam_Pack()=6749696
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 )
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