Structure + Memory + WriteData

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
H.Brill
Beiträge: 497
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Structure + Memory + WriteData

Beitrag von H.Brill »

Hab den Fehler endlich gefunden :
Wenn Define.irgendwas im Hauptprogramm
steht, gilt diese Deklaration NICHT in einem
Unterprogramm (Procedure). Ist also nicht
Global gültig.

Habs jetzt in meiner Procedure stehen.

Sollte man evtl. in der Hilfe vermerken.
PB 6.10
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

Re: Structure + Memory + WriteData

Beitrag von ts-soft »

Das Define <> Global ist sollte doch wohl klar sein :wink:
Sonst wäre Global ja überflüssig.

Mit Define deklariert man lokale Variablen im Mainscorpe oder in Proceduren, wobei in der
Procedure Protected vorzuziehen ist.
Mit Global deklariert man globale Variablen, dies sollte immer im Mainscope erfolgen,
auch wenn die deklaration in Proceduren erlaubt ist.

Gruß
Thomas
Benutzeravatar
H.Brill
Beiträge: 497
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Structure + Memory + WriteData

Beitrag von H.Brill »

Gut zu wissen, aber wie bekomme ich
das ganze geregelt ?
Die Structure soll ja global sein und die
einzelnen Proceduren sollen die verschiedenen
Bereiche (b1, b2, b3) füllen. Eine andere Procedure
wiederum soll dann das ganze in eine Datei speichern.

Bei meinem jetzigen Versuch bleiben die Bereiche
leer. Kannste mir mal dabei helfen ? Habs unten
mal nur mit einer Füll-Procedure gemacht.

Code: Alles auswählen

EnableExplicit

Structure MyStruct
  b1.b[10]
  b2.b[20]
  b3.b[70]
EndStructure

Define.MyStruct b

Procedure fuelle()
Define.MyStruct a
 a\b1[0] = 'A'
 a\b2[0] = 'B'
 a\b3[0] = 'C'
EndProcedure

fuelle()
; nur für Anzeigen
Debug PeekS(@b\b1[0], 1, #PB_Ascii)
Debug PeekS(@b\b2[0], 1, #PB_Ascii)
Debug PeekS(@b\b3[0], 1, #PB_Ascii)
End
PB 6.10
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Structure + Memory + WriteData

Beitrag von Kaeru Gaman »

ei, indem du Global benutzt um die Variable zu definieren. :roll:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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

Re: Structure + Memory + WriteData

Beitrag von ts-soft »

Der Code ist ja wieder etwas wiedersprüchlich, wofür soll a dienen?
Ansonsten so:

Code: Alles auswählen

EnableExplicit

Structure MyStruct
  b1.b[10]
  b2.b[20]
  b3.b[70]
EndStructure

Global.MyStruct b

Procedure fuelle()
  b\b1[0] = 'A'
  b\b2[0] = 'B'
  b\b3[0] = 'C'
EndProcedure

fuelle()
; nur für Anzeigen
Debug PeekS(@b\b1[0], 1, #PB_Ascii)
Debug PeekS(@b\b2[0], 1, #PB_Ascii)
Debug PeekS(@b\b3[0], 1, #PB_Ascii)
End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Structure + Memory + WriteData

Beitrag von Kaeru Gaman »

außerdem muss die doch garnicht Global sein.
man braucht doch nur die Adresse an die Proc zu übergeben,
da macht man in der Proc nen strukturierten Pointer draus und greif ganz normal drauf zu.

... oder seh ich das falsch, @ts?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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

Re: Structure + Memory + WriteData

Beitrag von ts-soft »

Kaeru Gaman hat geschrieben:... oder seh ich das falsch, @ts?
Nein, aber so ist es einfacher zu verstehen und mehr Basic-Like. Wir sind
hier schließlich im Anfängerforum. Außerdem wirds problematisch wenns
in einer Procedure definiert wurde und in einer anderen per Pointer drauf
zugegriffen wird, weil das geht nur, solange die erstere nicht komplett
verlassen wurde und somit der Speicherbereich ungültig.

Gruß
Thomas
Benutzeravatar
H.Brill
Beiträge: 497
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Structure + Memory + WriteData

Beitrag von H.Brill »

Super, so gehts und verstehe ich es auch.
Hatte mich zu sehr mit dem 'Define - Kram'
verhakt. Geht auch ohne.

Danke nochmals.
PB 6.10
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

Re: Structure + Memory + WriteData

Beitrag von ts-soft »

Kein Problem, hier noch mal die Version, wie KG sie beschrieben hat:

Code: Alles auswählen

EnableExplicit

Structure MyStruct
  b1.b[10]
  b2.b[20]
  b3.b[70]
EndStructure

Define.MyStruct b

Procedure fuelle(*a.MyStruct)
  *a\b1[0] = 'A'
  *a\b2[0] = 'B'
  *a\b3[0] = 'C'
EndProcedure

fuelle(@b)
; nur für Anzeigen
Debug PeekS(@b\b1[0], 1, #PB_Ascii)
Debug PeekS(@b\b2[0], 1, #PB_Ascii)
Debug PeekS(@b\b3[0], 1, #PB_Ascii)
End
Bringt eigentlich keine Vorteile, ausser das eine eine Var weniger Global ist, dafür aber der
Fehlerteufel dichter :mrgreen:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Structure + Memory + WriteData

Beitrag von Kaeru Gaman »

wenn es sich nur um eine einzige handelt - klar.

aber sehr oft übergibt mal Strukturen an Proceduren, die zig mal vorkommen, Datensätze aus einer Liste oder sowas.
die alle Global zu machen wär ein Greuel, außerdem muss man der Proc dann sagen, welchen der hunderttausend Datensätze man meint.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten