Seite 1 von 3

Bug: IMA in ClearList() nach AddElement() in Prozedur

Verfasst: 23.02.2007 04:56
von PMV
Folgender Code gibt einen "invalid memory acces" in der Zeile ClearList().
Das passiert nur zusammen mit StructureUnion und einer Prozedur wie
hier. Wird das selbe ohne Prozedur oder StructureUnion gemacht, klappts.

Code: Alles auswählen

;ab PB 4.0 (PB4.01 hab ich net ;-) )
Structure Struc
  StructureUnion
    String1.s
    String2.s
  EndStructureUnion
EndStructure
Global NewList List.Struc()

Procedure Add(String.s)
   AddElement(List())
   List()\String1 = String
EndProcedure
Add("Key")
ClearList(List()) ;-ERROR!!!
PS: wäre nett, wenn das jemand Fred melden könnte. Und natürlich
dann hier bescheid sagen. Möchte ja auch auf dem laufenden sein :D

MFG PMV

Verfasst: 23.02.2007 08:01
von DrShrek
Lies Dir mal GENAU die Hilfe zu StructureUnion durch.

Der Fehler liegt bei Deinen Verständnis zu StructureUnion.
...allerdings eine Compiler Warning wäre möglicherweise sinnvoll.


Bei der Gelegenheit:
Wann wird das 'Beta' aus 'PureBasic 4.0 Beta' entfernt?

Re: Bug: IMA in ClearList() nach AddElement() in Prozedur

Verfasst: 23.02.2007 13:28
von Kaeru Gaman
PMV hat geschrieben:;ab PB 4.0 (PB4.01 hab ich net ;-) )
hast du nun 4.02, oder krebst du mit 4.00 rum? :?

bei mit tritt der IMA auch auf, allerdings mag das wirklich an der unsachgemäßen verwendung der Union liegen.
bei sachgemäßer verwendung tritt kein IMA auf:

Code: Alles auswählen

Structure Struc 
  StructureUnion 
    String1.s 
    String2.l 
  EndStructureUnion 
EndStructure 
Global NewList List.Struc() 

Procedure Add(String.s) 
   AddElement(List()) 
   List()\String1 = String 
EndProcedure 
Add("Key") 
ClearList(List())

Verfasst: 23.02.2007 16:17
von PMV
"ab" schließt PB 4.0 bis heute ein :wink:
Lies Dir mal GENAU die Hilfe zu StructureUnion durch.
*den zweizeiler noch mal durchles*

Da steht lediglich, das man "einige Felder innerhalb derselben Struktur
teilen" kann ... es steht nichts davon, das es nicht auch der selbe
Datentyp sein darf. Zudem das ganze in 3.92/ 3.93/ 3.94 funktioniert.
Ich denke ja wohl mal, das durch StructureUnion die Structurefelder
intern einfach nur auf die selbe Speicheradresse zeigen. Das es da nicht
mit gleichen Datentypen funktioniert erscheint mir was unlogisch. Was
gibt es da, was ich nicht weis?

StructureUnion hat für mich diesen vorteil gehabt ... wodurch Quellcode
wesentlich lesbarer wurde :cry: . ... mist. Dann müsste ich die Zeiger ja
selber umbiegen o_O ... oder mehr Kommentieren, aber beides nicht so
schön. -.-
Wann wird das 'Beta' aus 'PureBasic 4.0 Beta' entfernt?
Wenn PB das Beta-Statium verlässt? :lol:

MFG PMV

Verfasst: 23.02.2007 16:23
von #NULL
ich versteh' nicht richtig wobei das sinn machen soll. wieso willst du denn zwei verschiedene bezeichner für den selben speicher benutzen (und der bezeichner ist hier doch das einzige, was sich unterscheiden würde)?

Re: Bug: IMA in ClearList() nach AddElement() in Prozedur

Verfasst: 23.02.2007 16:27
von ts-soft
PMV hat geschrieben:

Code: Alles auswählen

;ab PB 4.0 (PB4.01 hab ich net ;-) )
Structure Struc
  StructureUnion
    String1.s
    String2.s
  EndStructureUnion
EndStructure
Ohne genauer zu schaun, ist diese Structure sinnlos!
String1.s und String2.s belegen denselben Speicherbereich. Es ist egal ob ich
jetzt String1 oder Strings2 schreibe, es wird immer derselbe Bereich
überschrieben :freak:

Verfasst: 23.02.2007 16:35
von PMV
Jap, der Bezeichner ist der einzige unterschied. Dient zur Lesbarkeit :wink:
hier hab ich Quellcode, wo ichs benutze (so bin ich ja aufs problem gestosen ^_^ )
http://www.purebasic.fr/german/viewtopic.php?t=12104

Natürlich gehts auch ohne ... aber ich hab lieber Aussagekräftige
Variablen(Strukturfeld-)namen :D

MFG PMV

Verfasst: 23.02.2007 16:38
von #NULL
also ich finde es nicht lesbarer oder übersichtlicher, walweise 'küche' oder 'schlafzimmer' zu sagen, wenn ich das klo meine.

Verfasst: 23.02.2007 16:41
von ts-soft
Aber es geht nur eine Variable je Typ. Ändere String2.s in String2.l und alles ist Roger :wink:

Verfasst: 23.02.2007 16:47
von #NULL
ansonsten kannste auch sowas nehmen. <)

Code: Alles auswählen

Macro Group
  Value
EndMacro

Macro Key
  Value
EndMacro

Macro Comment
  Value
EndMacro



Structure myS
  Typ.b

  Value.s
; StructureUnion
;   Group.s
;   Key.s
;   Comment.s
; EndStructureUnion
EndStructure
strctdVar.myS

strctdVar\Group = "my group"

Debug strctdVar\Group
Debug strctdVar\Key
Debug strctdVar\Comment