Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
4 - Anregungen & Vorschläge

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Vorherige Nachricht  |  Nächste Nachricht 
 08: Assoziative Arrays / ForEach .. EndFor
Autor: RGH (---.hsi6.kabel-badenwuerttemberg.de)
Datum:   17.09.14 18:34

08: Assoziative Arrays / ForEach .. EndFor

Ab Lieferung 6 kennt XProfan auch assoziative Arrays, bei denen der Index nicht ein numerischer Wert, sondern ein oder mehrere Strings ist. Es sind beliebig viele "Dimensionen" bzw. Schlüssel erlaubt.

WikiPedia: http://de.wikipedia.org/wiki/Assoziatives_Datenfeld

XProfan verwendet dafür den Datentyp "Hash". (Assoziative Arrays sind auch als Hash-Tables bekannt.).

Declare hash Name[]

Name: String - Name des Assoziativen Arrays.

Es dürfen keine Größen angegeben werden. Assoziative Arrays sind dynamisch.

Damit man auch durch ein solches Array ohne numerischen Index Blättern kann, wurde die Kontrollstrunktur FOREACH ... ENDFOR hinzugefügt:

ForEach Name[<Schlüsssel>], V1, V2 ... EndFor

Name: String - Name des Assoziativen Arrays.
Schlüssel: Strings - Ein oder mehrere Schlüssel zur Eingrenzung der Ergebnisse
V1: Stringvariable - enthält in der Schleife den Index-String
V2: Stringvariable - enthält in der Schleife den zugehörigen Wert

Set("HashDel",D) / D = Get("HashDel")

D: String - Delimiter zwischen Schlüsseln in der internen Speicherung auch auch beim Ergebnis von ForEach oder MoveArrToList. Voreingestellt ist "|"

Set("HashListDel",D) / D = Get("HashListDel")

D: String - Delimiter zwischen Schlüsseln und Wert bei MoveArrToList und umgekehrt sowie bei der dynamischen Erzeugung eines Hash-Arrays mit VAR und der Zuweisung von Werten an Hash-Arrays. Voreingestellt ist chr$(254).

Set("HashMode",N) / N = Get("HashMode")

N: Integer - 0 = Groß- und Kleinschreibung bei den Schlüsseln werden berücksichtigt / 1 = werden nicht berücksichtigt. Voreingestellt ist die 0.

Ein kleines Beispiel (mit ForEach ohne Schlüssel):
 cls
 
 declare hash person[]
 
 person["Vorname"] = "Hans"
 person["Name"] = "Mustermann"	
 person["Geburtstag"] = "01.01.01"	
 person["Wohnort"] = "Musterstadt"	
 person["Alter"] = 34
 
 print person["Vorname"]
 print person["Name"]
 print person["Geburtstag"]
 print person["Wohnort"]
 print Person["Alter"] * 2
 
 print
 
 var key$ = ""
 var value$ = ""
 
 ForEach person[], key$, value$
   print str$(&loop) + ": " + key$ + " = " + value$
 EndFor
 Print "Fertig!"
 
 waitinput
 end
 


Ein Beispiel mit mehreren "Dimensionen" bzw. Schlüsseln und ForEach mit Schlüsseln:
 cls
 
 declare key$, value$
 
 declare hash person[]
 
 person["A","Vorname"]="Hans"
 person[2,"Name","Hugo","X","Y"] = "Mustermann"	
 person["2","Geburtstag"] = "01.01.01"	
 person[4.5,"Wohnort"] = "Musterstadt"	
 person[2,"Alter"] = 34
 person["A","Vorname","Test"] = "Hugo"
 
 var int i = 2
 print person["A","Vorname"]
 print person[2,"Name","Hugo","X","Y"]
 print person[i,"Geburtstag"]
 print person[4.5,"Wohnort"]
 print Person[2,"Alter"] * 2
 print person["A","Vorname","Test"]
 
 print
 
 ForEach person[], key$, value$
   print str$(&loop) + ": " + key$ + " = " + value$
 EndFor
 
 Print
 
 ForEach person[2], key$, value$
   print str$(&loop) + ": " + key$ + " = " + value$
 EndFor
 
 print
 
 ForEach person["A","Vorname"], key$, value$
   print str$(&loop) + ": " + key$ + " = " + value$
 EndFor
 
 Print
 Print "Fertig!"
 
 waitinput
 end
 

Ist ein Schlüssel angegeben, muss er mit dem ersten Schlüssel (Dimension) des Eintrages übereinstimmen. Sind es mehrere, mit den entsprechenden führenden Schlüssel der Einträge.

Zu beachten ist, dass auch Ziffern funktionieren. Die interne Umwandlung in Strings macht es möglich.

Die Funktion PType$() gibt als Typ eines Hash-Arrays "H[]" aus. Hasharrays können einander zugewiesen werden. Mit SizeOf ermittelt man die Zahl der Einträge. Auch SetSize und die Zuweisung eines Ausdrucks ggf. mit &Index funktioniert. Wichtig: Schlüssel und Wert werden durch den mit Set("HashListDel", S) eingestellten String (voreingestellt ist chr$(254) ) getrennt :
 cls
 
 declare key$, value$
 declare hash test[]
 
 setsize test[],10
 test[] = "Eintrag"+str$(&Index) + Get("HashListDel") + str$(&index) + ". Eintrag"
 ForEach test[], key$, value$
   print str$(&loop) + ": " + key$ + " = " + value$
 EndFor
 
 Print
 Print "Fertig!"
 
 waitinput
 end

Der Schlüssel kann auch mehrere Dimensionen enthalten, die durch den Delimiter (s.o.) getrennt sind, etwa &Str$(&Index)+"|Vorname|Nachname"

Bei MoveArrToList werden Schlüssel und Wert durch den mit Set("HashListDel", S) eingestellten String (voreingestellt ist chr$(254) ) getrennt in die Stringliste geschrieben und bei MoveListToArr entsprechend aufgeteilt

Ach ja: Und Clear Name[] macht was es auch mit anderen dynamischen Arrays macht: Es reduziert die Größe auf 0, d.h. es bleibt weiterhin deklariert, hat aber keine Einträge mehr.

 Foren-Liste  |  Alle Antworten   Neuerer Beitrag  |  Älteres Thema 

 Beiträge Autor  Datum
 Vorschau auf XProfan X3 (19.07.2015)  Neu
RGH 17.08.14 13:30 
 01: PLAY (und MUSIC) optimiert  Neu
RGH 17.08.14 13:41 
 02: MUSIC jetzt mehrstimmig und in Stereo und auf Wunsch auch im Hintergrund  Neu
RGH 17.08.14 15:17 
 03: Erweiterte Dateibefehle  Neu
RGH 03.09.14 14:38 
 04: Neue und erweiterte Array-Befehle und -Funktionen  Neu
RGH 03.09.14 14:54 
 05: Ressourcen auslesen mit ADDRES  Neu
RGH 09.09.14 22:18 
 06: Ressourcen bearbeiten mit der Container-Funktion RES  Neu
RGH 09.09.14 22:37 
 07: Erweiterung vom TREEVIEW()  Neu
RGH 10.09.14 15:17 
 08: Assoziative Arrays / ForEach .. EndFor  Neu
RGH 17.09.14 18:34 
 09: For ... Endfor  Neu
RGH 17.09.14 18:47 
 10: Move-Funktionen erweitert und in Container-Funktion Move() vereinigt  Neu
RGH 23.09.14 17:13 
 11: STARTPAINT - ENDPAINT jetzt mit Stack  Neu
RGH 24.09.14 23:45 
 99: Behobene Bugs  Neu
RGH 25.09.14 18:08 
 97: Erweiterte Funktionen und Befehle  Neu
RGH 25.09.14 18:13 
 12: Listboxliste sortieren  Neu
RGH 27.09.14 13:01 
 13. MIDI(  Neu
RGH 29.09.14 21:07 
 14: SMTP-Mailversand mit STARTTLS und SSL/TLS  Neu
RGH 01.10.14 14:24 
 15: Neuer Variablentyp: WIDESTRING  Neu
RGH 05.10.14 02:07 
 16: Funktionen für UTF8-Strings  Neu
RGH 01.11.14 00:09 
 17: Ressourcen beim Erzeugen des Programmes hinzufügen  Neu
RGH 18.12.14 23:27 
 18: Menüs für alle Fenster  Neu
RGH 27.06.15 19:58 
 XProfan X3 ist fertig!  Neu
RGH 19.07.15 17:37 


 Dieses Thema ist geschlossen. 

phorum.org