Data - auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Data - auslesen

Beitrag von Ironsmurf »

Hallo zusammen
wollte mich etwas mit Proceduren und Data beschäftigen, habe auch ein sehr schönes Beispiel im Forum gefunden, bin gerade dabei es für Strings umzuschreiben, leider habe ich noch einen Fehler den ich nicht finden kann.
Für eure Mühe ein nettes Dankeschön im voraus.

Code: Alles auswählen

DataSection
Label:
Data.w 1
Data.w 6
Data.w 10
Data.w 19
Data.w 30
EndDataSection

Procedure.w Daten(i)
  ProcedureReturn PeekW(?Label+2*i)
EndProcedure

For i=0 To 4
  Debug Daten(i)
Next

;##################################################

DataSection
Fluss:
Data.s ("rhein")
Data.s ("main")
Data.s ("havel")
Data.s ("spree")
Data.s ("fulda")
EndDataSection

Procedure.s Fluss(i)
  ProcedureReturn PeekS(Str(Fluss) ; ???????????????????????????????
EndProcedure

For i=0 To 4
  Debug Fluss(i)
Next
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Eine Variante ohne PeekS:

Code: Alles auswählen

DataSection 
Fluss: 
Data.s ("rhein") 
Data.s ("main") 
Data.s ("havel") 
Data.s ("spree") 
Data.s ("fulda") 
EndDataSection 

Procedure.s Fluss(i) 
  Read Fluss$
  ProcedureReturn Fluss$
EndProcedure 

Restore Fluss
For i=0 To 4 
  Debug Fluss(i) 
Next
Gruß
Helle
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Wieso benutzt du nicht READ ?

Aber Ganz nebenbei ... mir war immer so, dass pro Programm immer nur
eine DATASECTION existieren darf ? bzw glaub ich das die zweite nicht mehr ausgelesen wird.

Und die Klammern bei Data.s macht mich auch ganz nervös ....

Also mit folgendem Code gehts eigentlich:

Code: Alles auswählen

Procedure.w Daten(i)

Restore Label

For x=1 To i
Read a.w
Next x

ProcedureReturn a
EndProcedure
Procedure.s Fluss(i)

Restore Fluss

For x=1 To i
Read a.s
Next x

ProcedureReturn a
EndProcedure

;##################################################

DataSection
Label:
Data.w 1
Data.w 6
Data.w 10
Data.w 19
Data.w 30
Fluss:
Data.s "rhein"
Data.s "main"
Data.s "havel"
Data.s "spree"
Data.s "fulda"
EndDataSection


Debug Fluss(3)
Debug Daten(2)
Edit: AArgh wieder maln Tick zu langsam... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

So ungefähr ging es mit Peeks:

Code: Alles auswählen

DataSection 
Fluss: 
Data.s ("rhein") 
Data.s ("main") 
Data.s ("havel") 
Data.s ("spree") 
Data.s ("fulda") 
EndDataSection 

adresse=?fluss
For i=0 To 4
Debug PeekS(Adresse)
adresse=adresse+Len(PeekS(adresse))+1
Next
Windows 11 - PB 6.03 x64
_________________________________
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wieso macht ihr Klammern bei Data? :shock:

und wozu Peek? es gibt doch Read.

Code: Alles auswählen

DataSection
Label:
Data.w 1
Data.w 6
Data.w 10
Data.w 19
Data.w 30
EndDataSection

Restore Label
For i=0 To 4
  Read Number 
  Debug Number
Next

;##################################################

DataSection
Fluss:
Data.s "rhein"
Data.s "main"
Data.s "havel"
Data.s "spree"
Data.s "fulda"
EndDataSection

Restore Fluss
For i=0 To 4
  Read Fluss.s
  Debug Fluss
Next
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Kaeru Gaman hat geschrieben:wieso macht ihr Klammern bei Data? :shock:
und wozu Peek? es gibt doch Read.
....Copy&Paste vom ersten Code.
....PeekS, weil er danach indirekt fragte.
Ich denke mal mit Read wird er es wissen, da dies in der Hilfe auf der selben Seite wie Labels, Datasection, ... steht (glaube ich).
Windows 11 - PB 6.03 x64
_________________________________
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich habe eher den Verdacht, er hat sich aus dem Forum irgendein Beispiel gegriffen,
wo halt gezeigt wurde wie es mit Peek geht, und hat garnicht in die Help geschaut,
wo vermittelt wird, dass man das normalerweise mit Read macht.

... sonst wär er ja wohl auch kaum auf die Klammern gekommen,
die sind nämlich in der Help nicht drin, und da wirds auch mit Strings gezeigt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Windows 11 - PB 6.03 x64
_________________________________
Little John

Beitrag von Little John »

Mir geht es hier vor allem um den allgemeinen Vergleich von "Read" und "Peek()". Ich zitiere mal Code von Kaeru Gaman:

Code: Alles auswählen

DataSection
Label:
Data.w 1
Data.w 6
Data.w 10
Data.w 19
Data.w 30
EndDataSection

Restore Label
For i=0 To 4
  Read Number
  Debug Number
Next
Wenn man die Daten wie hier sequentiell nacheinander lesen will, ist das OK. Der Nachteil bei der Methode ist halt, dass man alle Daten sequentiell nacheinander lesen muss. D.h. wenn ich z.B. 1000 Nummern in der DataSection habe und will die vorletzte Nummer lesen, muss ich mit der Read-Methode auch alle vorangehenden lesen. Das kostet Zeit. Mit Peek() kann man das i als Index benutzen und den betr. Wert direkt lesen. Noch schneller geht es wahrscheinlich mit einem Pointer:

Code: Alles auswählen

DataSection
   Label:
      Data.w 1, 6, 10, 19, 30
EndDataSection

i = 4
*p.word = ?Label + i*SizeOf(word)
Debug *p\w
Oder habe ich da was übersehen?

Ob das mit Strings auch so geht weiß ich nicht, weil ich nicht weiß ob an der betr. Adresse in der DataSection die ganzen Strings stehen, oder nur Zeiger auf die Strings.
Hab jetzt auch keine Lust das auszuprobieren. :D

Gruß, Little John
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Little John hat geschrieben:Hab jetzt auch keine Lust das auszuprobieren. :D
Guck mal auf mein Beispiel. Mit Peeks() kann man immer nur einen String auslesen (null-terminierter String). Dann muss man für den nächsten String die Adresse verschieben.
Windows 11 - PB 6.03 x64
_________________________________
Antworten