Seite 1 von 2

Data - auslesen

Verfasst: 09.08.2008 19:20
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

Verfasst: 09.08.2008 19:57
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

Verfasst: 09.08.2008 20:02
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... ;)

Verfasst: 09.08.2008 20:08
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

Verfasst: 09.08.2008 20:24
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

Verfasst: 09.08.2008 20:28
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).

Verfasst: 09.08.2008 20:33
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.

Verfasst: 09.08.2008 20:57
von marco2007

Verfasst: 10.08.2008 11:38
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

Verfasst: 10.08.2008 12:46
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.