LinkedList in Modulen

Anfängerfragen zum Programmieren mit PureBasic.
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

LinkedList in Modulen

Beitrag von Phil »

Hallo,
ich habe versucht eine LinkedList in ein Common-Modul einzubauen und festgestellt, dass ich merkwürdige Fehlermeldungen erhalte. Im ersten Code "LinkedList nicht initialisiert" und im zweiten "ungültiger Speicherzugriff. Lesefehler an der Adresse 50." Kann mir jemand erklären, weshalb das nur mit "Global" funktioniert und ich unterschiedliche Fehlermeldungen bekomme?
Grüße Phil

Code: Alles auswählen

EnableExplicit

DeclareModule Common_GUI
  
  Structure struc_Test
    String.s
    Nummer.l
  EndStructure
  
  ; Global NewList TestListe.struc_Test() ; Das statt der nächsten Zeile funktioniert!
  NewList  TestListe.struc_Test()
  
EndDeclareModule

Module Common_GUI :
  
  NewList TestListe.struc_Test()
EndModule

Procedure TestProzedur()
  
  ;   UseModule Common_GUI
  ;    
  ;   AddElement(TestListe())
  ;   With TestListe()
  ;     \String="Test1"
  ;   EndWith
  ;   UnuseModule Common_GUI  
  
  AddElement(Common_GUI::TestListe())
  With Common_GUI::TestListe()
    \String="Test2"
  EndWith
  
EndProcedure

;- Hauptteil

TestProzedur()

ForEach Common_GUI::TestListe()
  Debug Common_GUI::TestListe()\String
Next

Code: Alles auswählen

EnableExplicit

Structure struc_Aufgabe
  String.s
EndStructure

Enumeration 
  #W_Hauptfenster
EndEnumeration

Enumeration 
#G_Aufgabenflaeche_sca  
EndEnumeration

DeclareModule Common_GUI
  
  Structure struc_AufgabenG
    G_AufgabenString_Txt.l
  EndStructure
  
  ;Global   NewList Aufgabengadget.struc_AufgabenG() ; Das funktioniert
  NewList Aufgabengadget.struc_AufgabenG()
  
EndDeclareModule

Module Common_GUI 
EndModule

Procedure Fenster_oeffnen(List Aufgabe.struc_Aufgabe())
  
  OpenWindow(#W_Hauptfenster,0,0,1024,768,"KopfrechenTest",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  ScrollAreaGadget(#G_Aufgabenflaeche_sca,0,50,1024,718,600,2000); Höhe noch an Anzahl der Aufgaben anpassen

  AddElement(Common_GUI::Aufgabengadget())
  With Common_GUI::Aufgabengadget()
    \G_AufgabenString_Txt = TextGadget(#PB_Any,0,0,100,30, "")    
  EndWith
   
;   UseModule Common_GUI
;   AddElement(Aufgabengadget())
;   With Aufgabengadget()
;     \G_AufgabenString_Txt = TextGadget(#PB_Any,0,0,100,30, "")
;     \G_Zeitnahme_Btn = ButtonGadget(#PB_Any,110,0,100,30,"Zeit messen")
;   EndWith  
;   UnuseModule Common_Gui

EndProcedure

;- Hauptteil

NewList Aufgabe.struc_Aufgabe()

Fenster_oeffnen(Aufgabe())

End
PB 5.62 on Win10
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: LinkedList in Modulen

Beitrag von matbal »

Du versuchst in beiden Beispielen auf eine Liste zuzugreifen, die sich außerhalb der Prozedur befindet. Alles das, was du im DeclareModule-Block declariert hast, befindest sich ja nicht in deiner Prozedur.

Eine mögliche Lösung könnte sein, die Liste im Modul global zu machen...
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Re: LinkedList in Modulen

Beitrag von Phil »

Das könnte eine Möglichkeit sein, erklärt leider nur nicht, warum zwei verschiedene Fehlermeldungen ausgegeben werden.

Und nicht ganz nachvollziehbar ist für mich, dass dieser Code läuft. Die Variable ist ja mit define nicht in der Prozedur bekannt...

Code: Alles auswählen

EnableExplicit

DeclareModule Common_GUI
  
  Structure struc_Test
    String.s
    Nummer.l
  EndStructure
  
  Global NewList TestListe.struc_Test() ; Das funktioniert!
  
  Define Variable.l = 1; Diese Variable ist auch nicht in der Prozedur bekannt!
  
EndDeclareModule

Module Common_GUI :
  
  NewList TestListe.struc_Test()
EndModule

Procedure TestProzedur()
  
  UseModule Common_GUI
  ;Debug Variable ; Diese Zeile funktioniert nicht!
  AddElement(TestListe())
  With TestListe()
    \String="Test1"
  EndWith
  UnuseModule Common_GUI 
  
  
  Debug Common_GUI::Variable
  AddElement(Common_GUI::TestListe())
  With Common_GUI::TestListe()
    \String="Test2"
  EndWith
  
EndProcedure

;- Hauptteil

TestProzedur()

ForEach Common_GUI::TestListe()
  Debug Common_GUI::TestListe()\String
Next
PB 5.62 on Win10
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: LinkedList in Modulen

Beitrag von mk-soft »

Mit Beta 14 behoben...

Anderer fehler noch:
http://www.purebasic.fr/english/viewtop ... =4&t=56311

P.S. Kein Fehler: Verständnisfehler wofür "Define" ist...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: LinkedList in Modulen

Beitrag von matbal »

Phil hat geschrieben:Und nicht ganz nachvollziehbar ist für mich, dass dieser Code läuft. Die Variable ist ja mit define nicht in der Prozedur bekannt...
Keine Ahnung, ob ich richtig liege, aber es scheint mir ein Fehler zu sein...

Meiner Ansicht nach dürfte der Zugriff auf die Variable eigentlich nicht möglich sein. Es sollte sich also so verhalten, wie beim Verwenden von UseModule. Man braucht sich ja nur mal die Module wegzudenken: Ohne Module wäre der Zugriff von der TestProzedur() auf die Variable auch nicht möglich.

Hier ein noch etwas einfacherer Code, der das gleiche Problem zeigt:

Code: Alles auswählen

DeclareModule MyModule
   EnableExplicit
   
   Define a = 10
   Global b = 20
EndDeclareModule

Module MyModule
EndModule

;----------------------

EnableExplicit

Procedure Test1()
   Debug MyModule::a      ; ???? 
   Debug MyModule::b
EndProcedure

Procedure Test2()
   UseModule MyModule
   ; Debug a   ; kein Zugriff möglich ohne Shared
   Debug b
   UnuseModule MyModule
EndProcedure

Test1()
Test2()
Ohne Module würde das selbe so aussehen:

Code: Alles auswählen

EnableExplicit

Define a = 10
Global b = 20

;----------------------

Procedure Test1()
   ;Debug a
   Debug b
EndProcedure

Procedure Test2()
   ;Debug a
   Debug b
EndProcedure

Test1()
Test2()
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: LinkedList in Modulen

Beitrag von Nino »

Hier ein noch etwas einfacherer Code, der das gleiche Problem zeigt:
Ich kann das Problem bestätigen (PB 5.20 beta 15, Windows XP x86). Die Zeile

Code: Alles auswählen

   Debug MyModule::a      ; ???? 
sollte IMHO eine Fehlermeldung verursachen (tut sie aber nicht). Dein zweiter Code verdeutlicht die Situation ja sehr schön.
Es ist also ein Bug, denke ich.
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Re: LinkedList in Modulen

Beitrag von Phil »

Hallo,
nun hat sich mit Beta 17 der Fehler eher noch ausgeweitet.

Code: Alles auswählen

DeclareModule MyModule
   EnableExplicit
   
   Define a = 10
   Define NewList Testliste.s()
   AddElement(Testliste())
   Testliste()="TestListe"
 EndDeclareModule

Module MyModule
EndModule

;----------------------

EnableExplicit

Procedure Test1()
  Debug MyModule::a      ; Das funktioniert...
  ;Debug MyModule::Testliste() ; das hier nicht...
EndProcedure

Procedure Test2()
   UseModule MyModule
   Debug a   ; Das funktioniert jetzt seit Beta 17 auch!
   UnuseModule MyModule
EndProcedure

Test1()
Test2()
Ich würde es aber eher begrüßen, wenn dieser "Bug" auch für LinkedLists usw. funktionieren würde. Meiner Meinung nach sollten alle im Declare-Teil des Moduls aufgeführten Variablen/Lists/Arrays auch in Prozeduren mit einem einfachen UseModule oder MyModule:: zugänglich sein.
PB 5.62 on Win10
Antworten