[Falsch-Verwendung] Parameter-Übergabe: String
- 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
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.
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.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

@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.
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.
- 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
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.
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.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

@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.
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.
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()
- 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
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.

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.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.
Warum wird dann der String-Inhalt geköscht?ts-soft hat geschrieben:Meiner Einschätzung nach kein Bug, zumal Stings in Strukturen nur als
Pointer vorliegen.
- 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
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
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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.ts-soft hat geschrieben:Erkläre mir lieber warum Du eine Strukture mit einem String in eine andere
als StructureUnion packtst.
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
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
Ich hab den Code jetzt wieder gekürtzt:
Wenn ich nun die Zeile 19 als Kommentar setze, funktioniert wieder alles. Was stimmt da nicht?
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'?