- 28 Oct 2024
- 5 Minuten zu lesen
- Drucken
- DunkelLicht
- pdf
Datentypen
- Aktualisiert am 28 Oct 2024
- 5 Minuten zu lesen
- Drucken
- DunkelLicht
- pdf
Es gibt 4 Klassen von Datentypen im visuellen Parametersystem.
| (NUM, STRING, ) |
| (ARRAY, (VOID), LIST) |
| (VECTOR, SEGMENT, ARC) |
| (DotNet-Wrapper Objects) |
Der Variablentyp kann immer anhand der TYPE-Funktion abgefragt werden wie z.B.: sTyp = TYPE$(varname)
Einfache Datentypen
Einfache Datentypen wären numerische (Ganzzahlige oder Kommazahlen) oder alpha-numerische Variablen (Strings). Der Typ wird durch die Initialisierung festgelegt:
!Lokale Definitionen --------------------------
DEFINE VARIABLE nArgs = 0 !Ganzzahlig
DEFINE VARIABLE fFaktor = 0.5 !Gleitkommazahl
DEFINE VARIABLE acTempDir = "" !String
!Globale Definitionen -------------------------
maxAnzahl = 20
Komplexere Datentypen
Arrays
Arrays sind indizierte Variablen auf die über einen numerischen Index oder mehrere numerische Indizes auf deren Inhalt zugegriffen werden kann. Diese können sowohl global wie auch lokal definiert werden.
Format:
DIM name ( n [ [ , n ] [ , n ] ... ] ) !Globale Definition
DEFINE VARIABLE name ( n [ [ , n ] [ , n ] ... ] ) !Lokale Definition
Es sind maximal 5 Dimensionen definierbar. Die Anzahl der Elemente darf 100.000 nicht überschreiten. Vor allem bei mehrdimensionalen Arrays sind 100.000 Elemente sehr schnell erreicht, da sich die Dimensionen multiplizieren.
So hätte ein Array mit drei Dimensionen bereits 1.000.000 Elemente. Jedes Element muss durch seinen Namen und die komplette Anzahl seiner Indizes angesprochen werden. Wurde z. B. ein dreidimensionales Array Breite(5,5,5) definiert, kann ein Element nur durch die Angabe aller Indizes angesprochen werden, z. B. durch Breite(1,1,2) = 5.
Die mit DIM definierten Bereiche können erst in einem Ausdruck verwendet werden, wenn ihnen ein Wert zugewiesen wurde – vorher ist dieser Typ unbestimmt (VOID).
DIM arrAbstaende(3)
arrAbstaende(1) = 1
arrAbstaende(2) = "st"
MESSAGE TYPE$(arrAbstaende(3)) !"VOID"
Im Gegensatz zu anderen Programmier- bzw. Makrosprachen müssen hier die Elemente eines Arrays nicht unbedingt einem Typ (Zeichenkette oder numerisch) angehören. Wurde einem Element einmal ein Typ zugeordnet, ist diese Zuweisung bindend.
Es kann also nicht innerhalb eines Makros einem Element zuerst ein numerischer Wert z. B. as(2) = 123 und später eine Zeichenkette durch as(2) = "Vorname" zugewiesen werden.
Arrays können nicht an Prozeduren oder Funktionen übergeben werden!
Zeichenkettenlisten
Eine Zeichenkettenliste ist eigentlich ein formatierter String welcher eine Reihe von Einträgen enthält, die durch ein Standardtrennzeichen (Komma) getrennt sind. Für diese Zeichenkettenlisten stehen einige Funktionen zur Verfügung:
ENTRY(Index, Zeichenkettenliste [ , Trennzeichen ])
Gibt einen Eintrag vom Typ String innerhalb der Zeichenkettenliste zurück, falls der Index größer 0 und nicht größer als NUMENTRIES(Zeichenkettenliste) ist. Über Index steuert man den wievielten Eintrag man gerne zurückhaben möchte. Wird das Trennzeichen nicht angegeben, wird der Standardwert (das Komma) herangezogen.
Bevor man via ENTRY() auf Zeichenkettenlisten zugreift sollte man überprüfen ob der String überhaupt Einträge enthält, ob das richtige Trennzeichen verwendet wird und ob der Index nicht größer als NUMENTRIES(Zeichenkettenliste) ist!
Beispiel:
sTier1 = ENTRY(1, "Anakonda;Barbe;Chamäleon;Dohle", ";") !sTier1 = "Anakonda"
LOOKUP(SuchString, Zeichenkettenliste [ , Trennzeichen ] )
Gibt den Index eines Eintrags innerhalb der Zeichenkettenliste zurück. Suchstring ist die gesuchte Zeichenkette. Zeichenkettenliste ist eine Liste von Strings die durch ein Trennzeichen getrennt sind. Trennzeichen ist ein Zeichen, das zur Trennung der Werte der Liste verwendet werden soll.
Der Standard-Wert ist das Komma. Der Index der ersten Zeichenkette ist immer 1, der der letzten entspricht immer NUMENTRIES(Zeichenkette).
LOOKUP() liefert 0 falls ein Eintrag nicht in der Zeichenkettenliste vorkommt!
Beispiel:
sLaender = "Österreich%Deutschland%Schweiz%Italien" ! % als Trennzeichen
IF LOOKUP("Frankreich", sLaender, "%") = 0 THEN
MESSAGE "Frankreich ist kein gültiges Land!" ! Element der Liste
ENDIF
NUMENTRIES(Zeichenkettenliste [ , Trennzeichen ] )
Gibt die Gesamtzahl der Einträge einer Zeichenkettenliste zurück. Zeichenkettenliste ist ein String der Strings enthält, welche durch ein festgelegtes Trennzeichen voneinander getrennt sind. Das Standardtrennzeichen ist das Komma (,).
Beispiel:
sLaender = "Österreich%Deutschland%Schweiz%Italien" ! % als Trennzeichen
lstLaender = {} ! leere Liste
FOR a = 1 TO NUMENTRIES(sLaender, "%") DO BEGIN ! von 1 bis zur Gesamtzahl
sLand = ENTRY(a, sLaender, "%") ! Eintrag a der Liste
lstLaender = APPEND(lstLaender, sLand) ! In Liste anhängen
END
Listen
Eine Liste ist eine Sammlung von Variablen, die durch Kommas getrennt zwischen geschweiften Klammern geschrieben werden. Diese Variablen können selbst wieder Listen oder andere Datentypen enthalten.
Beispiele wären:
lstP ={2,3,5,7}
für die ersten 4 Primzahlen oder
lstSatz = {{"Mayer", "Fritz", "Holzweg", 13, 4711, "Kloms"}, lstP}
für eine Adresse und Primzahlen. Über die Funktion TYPE$ kann man die einzelnen Listeneinträge nach dem Typ abfragen, wie z.B.:
IF TYPE$(lstSatz[1][1])="STRING" THEN MESSAGE "Nachname ist alphanumerisch!"
Die Anzahl der Element einer Liste bekommt man immer über das .NUM-Attribut und auf die einzelnen Elemente wird mit dem []-Operator zugegriffen. Zusätzlich gibt es noch 5 Funktionen für Listen: APPEND(), INSERTENTRY(), DELETEENTRY(), RCR() und RCL()
Funktion | Verwendung | Beschreibung |
APPEND | Liste = APPEND(Liste, Variable) | Hinzufügen am Ende |
INSERTENTRY | Liste = INSERTENTRY(Position, Liste, Variable) | An Position einfügen |
DELETEENTRY | Liste = DELETEENTRY(Position, Liste) | Listenelement an Position löschen |
RCR | Liste = RCR({"a","b","c"}) | Tauscht Elemente nach rechts durch |
RCL | Liste = RCL({"a","b","c"}) | Tauscht Elemente nach links durch |
Zugriff | Beispiel | Beschreibung |
Liste[i] | Element = Liste[i] | Liefert das i-te Element in der Liste |
Liste.NUM | nAnzahl = Liste.NUM | Liefert die Anzahl der Elemente in der Liste auf nAnzahl zurück |
Beispiele:
lstAntworten = {} : lstAntworten = APPEND(lstAntworten, "Gelb")
lstAntworten = APPEND(lstAntworten, "Lila") : lstAntworten = APPEND(lstAntworten, "Rot")
nAnz = lstAntworten.NUM
lstAntworten = INSERTENTRY(nAnz-1, lstAntworten, "Blau")
lstAntworten = DELETEENTRY(1, lstAntworten)
!lstAntworten = {"Blau","Lila","Rot"}
MESSAGE lstAntworten[1] !Liefert "Blau"
lstlstMasse = {{400,1600},{2000,2200},{2800,2900}} !Bei Zugriff bei Listen in Listen
MESSAGE lstlstMasse[3][1] !Verwendung von [i][j] -> liefert 2800!
MESSAGE lstlstMasse[3].NUM !Ergibt 2
lstBeispiel = {"a","b","c"}
lstErg = RCR(lstBeispiel) !liefert {"c","a","b"}
Mathematische Datentypen
Für math. Berechnungen und die Grafikprogrammierung gibt es 3 Datentypen:
Vektoren | (Typ VECTOR) |
Kreise / Kreisbögen | (Typ ARC) |
Streckenzüge | (Typ SEGMENT) |
Vektoren (VECTOR)
Ein Vektor V wird definiert als eine einreihige Matrix. In der zweidimensionalen Vektorarithmetik besteht ein Vektor V aus zwei reellen Zahlen ( x und y ), die seine zwei Koordinaten im kartesischen Koordinatensystem darstellen. Weitere Merkmale des Vektors sind sein Zahlenwert L (Betrag) und seine Richtung a. Er wird graphisch meist durch einen Pfeil wiedergegeben, der auch über dem Namen zur Kennzeichnung als Vektor verwendet wird. Ein Punkt repräsentiert eine eindeutige Position in einem zweidimensionalen kartesischen Koordinatensystem und kann mittels eines Vektors definiert werden. Die Begriffe Vektor und Punkt können deshalb analog verwendet und miteinander getauscht werden.
Definition in der Makrosprache:
durch die Funktion Vector | V1 = VECTOR(X,Y) |
durch zwei Zahlen zwischen eckigen Klammern | V1 = [X,Y] |
durch die Funktion Point | V1 = POINT(X,Y) |
durch Polar-Funktion mit Länge und Winkel in Rad | V1 = POLAR(200, PI/4) |
X = 10 : Y = 20
V1 = VECTOR(X,Y) ! 1. Möglichkeit
V1 = [X,Y] ! 2. Möglichkeit
V1 = POINT(X,Y) ! 3. Möglichkeit
V1 = POLAR(SQRT(X*X+Y*Y), ATN(X/Y)) ! 4. Möglichkeit (Polarform)
Attributname | Bedeutung |
V1.X | X-Koordinate des Vektors |
V1.Y | Y-Koordinate des Vektors |
V1.ARG | Winkel (Argument) des Vektors |
V1.MOD | Betrag (Modulus) des Vektors |
V1.NORM | orthonormaler Vektor des Vektors (nur Lesen) |
Kreise und Kreisbögen
n Profilen können Streckenzüge und Kreise und Kreisbögen verwendet werden. Ein Beispiel für ein Profil wo Streckenzüge und ein Kreisbogen vorkommen wäre ein Segmentbogenfenster.
Kreise (ARC)
Definition der Makrosprache:
kreis = ARC(Mittelpunkt, StartPunkt, Winkel in Radianten)
Winkel = PI/4 !8tel Kreis (45° Grad)
Winkel = PI !Halbkreis
Winkel = 2*PI !Vollständiger Kreis
Kreis = ARC([0,0], [400,0], 2*PI)
Kreisbogen (ARC)
Definition in der Makrosprache:
kb = ARCFROMSTRINGH(Vektor 1, Vektor 2, Sehnenhöhe des Kreisbogens)
p1 = [ 0, 0]
p2 = [700, 0]
p3 = [700, 400]
p4 = [ 0, 300]
Bogen = ARCFROMSTRINGH(p3, p4, 100)
lstSegA = {SEGMENT(p1,p2),
SEGMENT(p2,p3), Bogen,
SEGMENT(p4,p1)}
Attribute von Kreisbogen und Kreissehnen
Attributname | Bedeutung |
ARC.START | Anfangsvektor des Kreisbogens |
ARC.V1 | Analog zu .START |
ARC.CENTER | Zentrumsvektor des Kreisbogens |
ARC.ENDP | Endvektor des Kreisbogens (wenn er verändert wird und dadurch außerhalb der Kreislinie liegt, wird nur die Bogenlänge geändert und der Endpunkt wieder auf die Kreislinie gesetzt) |
ARC.V2 | Analog zu .ENDP |
ARC.ANG | Verlaufswinkel des Kreisbogens (ANG > 0 bei pos. Umlaufsinn, ANG < 0 bei neg. Umlaufsinn) |
ARC.R | Radius des Kreisbogens = Länge der Strecke, die CENTER und START miteinander bilden |
ARC.LENGTH | Länge des Kreisbogens |
ARC.ARG | Richtungswinkel der Strecke, die CENTER und START miteinander bilden |
ARC.STRINGH | Sehnenhöhe des Kreisbogens |
Streckenzüge (SEGMENT)
Ein Streckenzug ist immer eine Linie die durch zwei Punkte (P1, P2) definiert ist.
Attributname | Bedeutung |
SEGMENT.V1 | Anfangsvektor (Punkt1) der Strecke |
SEGMENT.X1 | X-Koordinate des Anfangspunkts |
SEGMENT.Y1 | Y-Koordinate des Anfangspunkts |
SEGMENT.V2 | Endvektor (Punkt2) der Strecke |
SEGMENT.X2 | X-Koordinate des Endpunkts |
SEGMENT.Y2 | Y-Koordinate des Endpunkts |
SEGMENT.V | Trägervektor der Strecke |
SEGMENT.ARG | Richtungswinkel der Strecke |
SEGMENT.MOD | Länge der Strecke |
SEGMENT.NORM | orthonormaler Vektor der Strecke (Nur Lesen) |
Definition in der Makrosprache:
strecke = SEGMENT(Punkt1, Punkt2)
Beispiel:
P1 = [10,10] : P2 = [40, 20]
segStrecke = SEGMENT(P1, P2)