Seite 2 von 3
Verfasst: 16.05.2007 17:39
von ts-soft
Nach 3 Tagen wurde hier immer noch kein nachvollziehbarer Bug gepostet,
ich denke mal das dieser Thread langsam reif für den Mülleimer wird, damit
hier wieder Platz für korrekte Bugmeldungen ist.
Ein bissel warte ich aber noch, es ist ja oft nicht leicht, den Code auf ein
nachvollziehbares Beispiel zu reduzieren (dies macht man aber eigentlich
vorher), aber das nächstes Wochendende kommt es weg. Kann ja notfalls
später erneut eröffnet werden.
Verfasst: 16.05.2007 19:31
von Leonhard
@CSprengel
Ich frage dich: Wie kann es kein Bug sein, wenn die falschen Werte ausgegeben werden, obwohl nur die Procedure beendet wird?
Ich habe schon lang an dem Code rum gebastelt und es kommt immer das gleiche raus. Ich hätte auch keine Probleme, jemandem, der den Fehler mal überprüfen möchten den gesamten Code zu geben. Wie in dem Abschnitt des Codes ist zu sehen, wird keine Funktion oder sonstiges zwischen der richtigen Ausgabe und der falschen Ausgabe ausgeführt. Es liegt lediglich daran, das die Procedure beendet wird.
Verfasst: 16.05.2007 21:23
von ts-soft
Solange der Bug nicht der folgende ist: PBCompiler kommt nur mit max. 100
Zeilen Source zurecht, sollte jeder Bug in einem Source von max. 100 Zeilen
reproduzierbar sein.
Bei längeren Sourcen ist auch die Wahrscheinlichkeit eines Fehlers von Seiten
des Programmierers wesentlich grösser.
Verfasst: 16.05.2007 22:58
von THEEX
@Leonard
Du willst es einfach nicht verstehn, vorallem während Du hier rum diskutierst, hättest Dir vielleicht mal die Mühe machen können, auf die Leut, die hier einiges vom Coden verstehn (mich ausgeschlossen), zu hörn. Ich schau mir schon laneg keinen unvollständige Codes mehr an, da hab ich einfach bessere zu tun. Und wenn der Code zu lang ist, schau ich auch nicht rein, ist nicht mein Ding in 1500 Zeilen rumzuwühlen und mir Gedanken zu machen, was da einer mit bezwecken will. Ich denke, da geht es vielen genau wie mir, mit der Zeit kann man sinnvolleres anstellen.
Ich finde zu 95 % meine Bugs selbst und 95 % meiner geposteten PureBasic-Bugs sind auch wirklich oder waren welche und glaub mir, ich hab einige gefunden. Maßgeblich geholfen hatte die vorgeschlagene Methode.
Verfasst: 17.05.2007 11:19
von Leonhard
Hier hab ich den Fehler mal in einer kleinen Test-Datei hinbekommen (47 Zeilen):
Code: Alles auswählen
;{ XIncludeFile "res.token.pbi"
Structure Token
sValue.s
EndStructure
;}
;{ XIncludeFile "res.pptoken.pbi"
#PPT_Token = 2
Structure pp_Parameter
bType.b
StructureUnion
tToken.Token
EndStructureUnion
EndStructure
Structure pp_Token
sCommand.s ;/ Befehl
Param1.pp_Parameter
EndStructure
;}
Global *tmpPPToken.pp_Token = AllocateMemory(SizeOf(pp_Token))
With *tmpPPToken
\sCommand = "TOKEN"
\Param1\bType = #PPT_Token
\Param1\tToken\sValue = "lVal"
EndWith
Global *tmpToken.Token
Procedure cg_sec_code_Expression()
Protected NewList Parameter.pp_Parameter()
AddElement(Parameter())
Parameter()\bType = #PPT_Token
CopyMemory(*tmpPPToken\Param1\tToken, @Parameter()\tToken, SizeOf(Token))
Debug "ByCopy(1): "+Parameter()\tToken\sValue
*tmpToken = AllocateMemory(SizeOf(Token))
CopyMemory(@Parameter()\tToken, *tmpToken, SizeOf(Token))
Debug "ByCopy(1.X): "+*tmpToken\sValue
DeleteElement(Parameter(), 1)
Debug "ByCopy(2): "+*tmpToken\sValue ;<-- sollte auch 'lVal' sein
EndProcedure
cg_sec_code_Expression()
Verfasst: 17.05.2007 12:43
von ts-soft
Sinn und Zweck entzieht sich mir völlig
Deine Liste in der Prozedure enthält jedoch nur ein Element, welches nach
dem löschen nur noch zufälligen Speicherinhalt anzeigt. Kann natürlich sein
das ich was übersehe, da solange ich den Sinn nicht verstehe ist der Code
auch unverständlich.
Meiner Einschätzung nach kein Bug, zumal Stings in Strukturen nur als
Pointer vorliegen.
Verfasst: 17.05.2007 13:11
von Leonhard
Der Code ist ja nur nen Beispiel, wie man zu dem Fehler kommt. Wenn du dir meine Code, den ich vorher gepostet habe die Procedure cg_sec_code_Expression(...) anschaust, siehst du, das die Liste nicht nur ein Element enthält. Der Code eben ist nur mittel zum zweck, um zu dem Fehler zu kommen.
ts-soft hat geschrieben:Meiner Einschätzung nach kein Bug, zumal Stings in Strukturen nur als
Pointer vorliegen.
Warum wird dann der String-Inhalt geköscht?
Verfasst: 17.05.2007 13:19
von ts-soft
Erkläre mir lieber warum Du eine Strukture mit einem String in eine andere
als StructureUnion packtst. Für mich ist das sinnfreier Code. Aber vielleicht
hat ja jemand anders Lust den Fehler in diesem sinnfreien Code zu suchen
Verfasst: 17.05.2007 13:28
von Leonhard
ts-soft hat geschrieben:Erkläre mir lieber warum Du eine Strukture mit einem String in eine andere
als StructureUnion packtst.
Also. Ich bin dabei, einen Compiler zu schreiben (wie schon erwähnt). Eventuell ist der Code etwas undeutlich, da ich nur die nötigsten daten angegeben habe.
Die Struktur mit dem String sieht eigendlich so aus
Code: Alles auswählen
Structure Token
lLineNr.l
lLinePos.l
sValue.s
dwType.l ;/ Der Typ wird als Flag angegeben
dwFlags.l
bInfo.b
EndStructure
und stellt die Token des Quellcodes da. Nun sind wir im Teil der Code-Generation, wo die Befehle z.B. '=' mit zwei Parameter angegeben sind. Dies steht in einem pp_Token:
Code: Alles auswählen
Structure pp_Token
lLineNr.l
lLinePos.l
sCommand.s ;/ Befehl
Param1.pp_Parameter
Param2.pp_Parameter
EndStructure
.
Dieser Token enthält eine Befehl (z.B. RETURN, =, ...) und 1 oder 2 Parameter. Da ich die Parameter von Assembler-Register, Token, Sektionen, ... unterscheiden muss, wird die Struktur pp_Parameter benötigt:
Code: Alles auswählen
Enumeration
#PPT_Empty = 0
#PPT_Value
#PPT_Token
#PPT_TokenList
#PPT_AsmReg ;/ Assembler-Register
#PPT_Buffer
EndEnumeration
Structure pp_Parameter
bType.b
StructureUnion
sValue.s
tToken.Token
plTokenList.PointerList
*Reg.ASM_Reg
*Buffer
EndStructureUnion
EndStructure
Verfasst: 17.05.2007 14:03
von Leonhard
Ich hab den Code jetzt wieder gekürtzt:
Code: Alles auswählen
;{ XIncludeFile "res.token.pbi"
Structure Token
sValue.s
EndStructure
;}
;{ XIncludeFile "res.pptoken.pbi"
Structure pp_Parameter
tToken.Token
EndStructure
Structure pp_Token
sCommand.s ;/ Befehl
Param1.pp_Parameter
EndStructure
;}
*tmpPPToken.pp_Token = AllocateMemory(SizeOf(pp_Token))
With *tmpPPToken
\sCommand = "TOKEN"
\Param1\tToken\sValue = "lVal"
EndWith
*tmpToken.Token
NewList Parameter.pp_Parameter()
AddElement(Parameter())
CopyMemory(*tmpPPToken\Param1\tToken, @Parameter()\tToken, SizeOf(Token))
Debug "ByCopy(1): "+Parameter()\tToken\sValue
*tmpToken = AllocateMemory(SizeOf(Token))
CopyMemory(@Parameter()\tToken, *tmpToken, SizeOf(Token))
Debug "ByCopy(1.X): "+*tmpToken\sValue
DeleteElement(Parameter(), 1)
Debug "ByCopy(2): "+*tmpToken\sValue ;<-- why dose it not 'lVal'?
Wenn ich nun die Zeile 19 als Kommentar setze, funktioniert wieder alles. Was stimmt da nicht?