Strings , Variablen, Arrays mit dem Atmega8




Der Begriff  String ist ja mittlerweile bekannt und wir wissen das es sich hier um Text-Variablen handelt.
Ein String bietet eine Menge Möglichkeiten.

Zwei Strings zusammenfügen haben wir schon kennen gelernt , indem man lediglich beide Strings mit einem
Plus verbindet :  String3 = String1 + String2

Wie kann man aber z.B. feststellen , ob sich ein bestimmtes Wort oder ein bestimmter Satzteil in einem String befindet ?
Hierfür gibt es den Befehl : INSTR

Positionsangabe = INSTR ( Startposition im String , der zu durchsuchende String , Suchwort )

Nehmen wir jetzt mal einen Beispiel String mit dem Inhalt : "Wer reitet so spaet durch Nacht und Wind"

Wir möchten jetzt prüfen, ob in diesem String , den wir z.B. per RS232 Seriell empfangen haben könnten ,
das Wort: Nacht enthalten ist ?

 
Dim Pos as byte
Dim Beispieltext as string * 40

Pos = instr(1,Beispieltext , "Nacht")


Wenn sich also in unserem Beispieltext das Wort: Nacht befindet , dann liefert POS die Position , an der das Wort steht.
In diesem Fall wäre Pos = 26
Wenn nicht das gesuchte Wort enthalten ist , dann liefert POS = 0 zurück


Jetzt kann es ja auch vorkommen, das man z.B. Zahlen seriell per RS232 senden möchte die größer als 255 sind.
Das geht natürlich so nicht , da seriell nur max eine Zahl bis 255 groß sein darf/kann , weil die serielle Kommunikation auf
Basis eines Bytes funktioniert.

Jetzt könnte man aber eine Zahl wie z.B. : 567 als String senden , denn bei Strings ( Texten ) ist es ja keine Zahl mehr.
Nun stellst sich aber die Frage , wenn man den Text nun empfangen hat , wie bekome ich daraus wieder ene Zahl um damit
weiter arbeiten zu können ?
Für diesen Zweck gibt es den Befehl : VAL

Wert = val (Text)

Es ist jedoch zu beachten , wenn man einen Text , der eine Zahl beinhaltet , den man wieder zu einer Variablen machen möchte,
entsprechend dimensioniert ist.

Beinhaltet der Text ein Zahl von 0-255 , dann kann man diese Zahl mit val in eine Byte-Variable umwandeln.
Ist die Zahl jedoch größer , dann muß man die Variable in der die Zahl gewandelt wird als Word dimensionieren.
Wir haben jetzt mal Text1 mit dem Inhalt : "123" und Text2 mit dem Inhalt: "567"

Beispiel :

Dim Bytewert as byte
Dim Wordwert as word
Dim Text1 as string *3
Dim Text2 as string *3

Text1 = "123"
Text2 = "567"


Bytewert = val(Text1)
Wordwert = val(Text2)




Jetzt haben wir ja schon in Teil II kennen gelernt wie man einzelne Werte seriell empfangen kann.
Würden wir jetzt als Beispiel 10 Werte an den Atmega senden wollen , müßte man ja eine Schleife programieren und
die 10 einzelnen Werte empfangen.

Das kann man natürlich auch eleganter gestalten und alles in einem Satz machen.

Wir senden die 10 Zahlen einfach als einen kompletten Text !

Nehmen wir mal die Zahlen 10 - 20 - 30 - 40 - 50 - 60 - 70 - 80 - 90 - 100
Diese würden wir dann in einem Satz einbauen , mit jeweils einem Komma getrennt :

"10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 , 100"

Würden wir jetzt die eben kennen gelernte Methode anwenden und per INSTR jedes Komma absuchen , haben wir es
dadurch natürlich nicht einfacher gemacht.
Nein , denn hierfür gibt es den Befehl: SPLIT

Anzahl gefundenen Elemente = split ( den zu durchsuchenen Text , Array , Trenner )

Auch dieser Befehl gibt einen Wert zurück und zwar die Anzahl an gefundenen Elementen die der String enthalten hat.

Ein Array ist im Grunde wie eine Variable.
Mit dem Unterschied das diese Variable einen Index hat.
Das heißt , man kann für z.B. 10 verschiedene Wert ein und den selben Variablen-Namen nehmen , wenn man die Variable
als Array dimensioniert und einen Anzahl an Index vergibt.

Der Trenner ist ein Zeichen , nachdem der Befehl split automatisch sucht um die einzelnen Elemente in die Array's zu packen.

In unserem Fall erwarten wir hier ja z.B. 10 Zahlen
Also würde ich ein Array aufmachen mit Namen Empfangswerte
Da nun 10 Werte erwartet werden , wird das Array mit 10 dimensioniert : Dim Empfangswerte (10)
Sollte man nicht genau wissen wieviel Werte nun ankommen werden , kann man das Array auch größer dimensionieren , denn der
Befehl: split hat ja als Rückgabewert die Anzahl gefundener Elemente.

Wichtig !
Wir erinnern uns , wir senden einen String ,  .... wir werten einen String mit split aus  , .... ergo - das Array muß als String dimensionert werden !


Beispiel :


Dim Empfangstext as string * 30
Dim Empfangswerte(10) as string * 3
Dim Anzahl as byte

Anzahl = split(Empfangstext,Empfangswerte(1),",")



Anzahl würde jetzt = 10 sein , denn es wurden 10 Elemente durch den Trenner ',' gefunden .
Empfangswert(1)  = "10"
Empfangswert(2)  = "20"
Empfangswert(3)  = "30"
Empfangswert(4)  = "40"
Empfangswert(5)  = "50"
Empfangswert(6)  = "60"
Empfangswert(7)  = "70"
Empfangswert(8)  = "80"
Empfangswert(9)  = "90"
Empfangswert(10) = "100"


Warum schreibe ich die Zahlen in " " ?
Damit wir dran denken das es noch Strings sind !

Als nächstes würde man die 10 Textstrings umwandeln in Variablen.

Beispiel :


Dim Empfangstext as string * 30
Dim Empfangswerte(10) as string * 3
Dim Wert(10) as byte
Dim Anzahl as byte
Dim A as byte

Anzahl = split(Empfangstext,Empfangswerte(1),",")


For A = 1 to Anzahl

    Wert(A) = val(Empfangswerte(A))

next A



 
Das ist ja das besonders schöne bei Arrays .
Durch den Index , kann man so etwas wunderbar in Schleifen nutzen , muß aber nicht jede
Variable einzeln aufrufen , sondern kann den Schleifenwert 'A' hier als Index für das Array nutzen.

Jetzt haben wir 10 Strings mit Texten  :
Empfangswert(1)  = "10"
Empfangswert(2)  = "20"
Empfangswert(3)  = "30"
Empfangswert(4)  = "40"
Empfangswert(5)  = "50"
Empfangswert(6)  = "60"
Empfangswert(7)  = "70"
Empfangswert(8)  = "80"
Empfangswert(9)  = "90"
Empfangswert(10) = "100"


und wir haben 10 Variabeln mit Werten :
Wert(1)  = 10
Wert(2)  = 20
Wert(3)  = 30
Wert(4)  = 40
Wert(5)  = 50
Wert(6)  = 60
Wert(7)  = 70
Wert(8)  = 80
Wert(9)  = 90
Wert(10) = 100





Jetzt gibt es ja auch mal den Wunsch , das man Zahlen und Texte zusammen fügen möchte als einen String.
Das kann man allerdings nicht so einfach wie als wenn es zwei Texte wären.

Man muß eine Variable erst zu einem String wandeln , dann kann man diesen String an einem anderen String anhängen.
Für diesen Zweck gibt es den Befehl : STR()


Beispiel :
 
Dim Text1 as String * 15
Dim Text2 as string * 3
Dim Txt3 as string * 20
Dim Zahl as byte

Zahl = 100
Text1 = "Sind 10 x 10 = "


Text2 = str(Zahl)
Text3 = Text1 + Text2 + " ?"


In Text3 steht jetzt : "Sind 10 x 10 = 100 ?"



Was uns jetzt noch fehlt , ist es einzelnen Textpassagen aus einem String entnehmen zu können.
Hierfür gibt es 3 Befehle :  LEFT / MID / RIGHT

Beispiel

Dim Text1 as String * 10
Dim Text2 as string * 5

Text1 = "ABCDEFGHIJKLMNO"

Möchte man die ersten 5 Zeichen haben , wäre das mit LEFT am einfachsten :

Text2 = Left(Text1,5)
Jetzt steht in Text2 : "ABCDE"


Möchte man die letzten 5 Zeichen haben , wäre das mit RIGHT am einfachsten :

Text2 = Right(Text1,5)
Jetzt steht in Text2 : "KLMNO"


Möchte man 5 Zeichen aus der Mitte , z.B. ab Position 8 haben , wäre das mit MID am einfachsten :

Text2 = Mid(Text1,8,5)
Jetzt steht in Text2 : "HIJKL"



zurück zur Beispiel-Übersicht