[Falsch-Verwendung] Parameter-Übergabe: String

Fragen und Bugreports zur PureBasic 4.0-Beta.
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 »

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.
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
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

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

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.
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
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag 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.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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()
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 »

Sinn und Zweck entzieht sich mir völlig :mrgreen:

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.
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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?
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 »

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
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
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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?
Gesperrt