Bascom Strings dimensioniere und splitten

Uwe H.

Neues Mitglied
27. Juli 2011
264
0
0
Hinter die Grenze :-)
Sprachen
  1. BascomAVR
  2. ANSI C
  3. Assembler
Hallo mal wieder :)

Ich hab mal wieder eine kleine Frage, die sich leider durch Internetrecherchen nur ungenügend beantworten ließ. Ich hab in mein Projekt eine mehrere Fehlersuchroutinen eingebaut inkl. Fehlerspeicher, der den Zeitpunkt, die Häufigkeit und andere Daten festhält. Hier gabs ein kleines Problem mit dem Zeitstempel. Ich habe den Zeitstempel in einen Vierer-Array gepackt als Long-Overlay:

Dim Time_marker_array(4) As Byte
Dim Time_marker As Long At Time_marker_array(1) Overlay

Klappt alles wunderbar. Der Zeitstempel sieht dann beim Abruf z.B. so aus:

11:26 am 01.01.2011 = 1101011126

Jetzt wollte ich den Zeitstempel auseinandernehmen und in ein normales Anzeigeformat wandeln. Dazu habe ich den Stempel zunächst zum String mit 10 Zeichen gewandelt, sprich:

Dim Zeitstempel as String *10

Und hier schon meine erste Frage: Die Anzahl "*10" gibt doch die Anzahl der Zeichen im String wieder, oder? D.h. wenn ich 10 Zeichen hab, wie bei meinem Zeitstempel, dann ist *10 korrekt, nicht?

Anschließend hab ich den String in 5 Stringarrays zerlegt, wo ich auch nicht sicher bin, ob ich das korrekt gemacht hab:

Dim Time_split(5) As String * 2
I = Split(zeitstempel , Time_split(1) , " ")

Meine Logik sagte mir: 5 Arrays * 2 Zeichen. Ist das korrekt formuliert? Wofür ist eigentlich der Zöhler am Anfang gut (bei mir I)? Das konnte ich aus der Bascomhilfe nicht so recht rauslesen. Sorry, falls die Frage etwas dumm ist, aber im Umgang mit Strings bin ich völlig blond :p
 
Hallo mal wieder :)

Dim Time_marker_array(4) As Byte
Dim Time_marker As Long At Time_marker_array(1) Overlay

Klappt alles wunderbar. Der Zeitstempel sieht dann beim Abruf z.B. so aus:

11:26 am 01.01.2011 = 1101011126
Hallo Uwe,
wie setzt du denn die Werte in Time_marker? Es ist noch nicht klar, wofür du überhaupt das Overlay nutzt.
Bis auf die Monate können alle Einzelzahlen über 16 hinausgehen, sodass du mit einem halben Byte nicht auskommst für eine Stelle. Demzufolge brüchtest du eigentlich 5 Bytes, wobei die Long aber nur 4 enthält.

Jetzt wollte ich den Zeitstempel auseinandernehmen und in ein normales Anzeigeformat wandeln.
Das musst du nicht notwendigerweise über Strings machen, da du ja über das Byte-Array auch an die einzelnen Stellen drankommst. Auch dabei wäre wieder wichtig, wie dein Zeitstempel abgespeichert werden soll

Dazu habe ich den Stempel zunächst zum String mit 10 Zeichen gewandelt, sprich:

Dim Zeitstempel as String *10

Und hier schon meine erste Frage: Die Anzahl "*10" gibt doch die Anzahl der Zeichen im String wieder, oder? D.h. wenn ich 10 Zeichen hab, wie bei meinem Zeitstempel, dann ist *10 korrekt, nicht?
Ja.

Anschließend hab ich den String in 5 Stringarrays zerlegt, wo ich auch nicht sicher bin, ob ich das korrekt gemacht hab:

Dim Time_split(5) As String * 2
I = Split(zeitstempel , Time_split(1) , " ")
" " bedeutet, dass du zwischen den zu trennenden Teilen des Strings Leerzeichen hast. Das ist bei dir aber nicht der Fall. Du kannst Split() also so nicht verwenden, weil es immer ein Trennzeichen möchte.
Bei dir wäre eher Mid() zu verwenden, wenn du denn mit Strings arbeiten möchtest.

Meine Logik sagte mir: 5 Arrays * 2 Zeichen. Ist das korrekt formuliert?
Ja.
Wofür ist eigentlich der Zöhler am Anfang gut (bei mir I)?
Da man nicht unbedingt weiß, aus wievielen Teilen der String besteht, speichert Bascom in I die Anzahl der zerlegten Teile ab.

Grundsätzlich halte ich Strings für solche Arbeiten nicht für die richtige Variante. Aber es scheint sehr unserem Denken entgegenzukommen, daher verwenden es so viele.

Gruß

Sebastian
 
Hallo Sebastian, hier ist die Speicherroutine. Die Zeitdaten werden aus einer DS1307 abgelesen.

Make_time_marker:

Gosub Getdatetime

Time_marker = _year
Time_marker = Time_marker * 100
Time_marker = Time_marker + _month
Time_marker = Time_marker * 100
Time_marker = Time_marker + _day
Time_marker = Time_marker * 100
Time_marker = Time_marker + _hour
Time_marker = Time_marker * 100
Time_marker = Time_marker + _min

Return


Diese Möglichkeit hab ich in einem meiner Bücher über Bascom gefunden. Wenn Du noch ne bessere Lösung hast, hab ich natürlich beide Ohren auf Empfang :)


Ich hab grad die mid-Variante ausprobiert. Hast Recht, die passt eher.
 
Time_marker = _year
Time_marker = Time_marker * 100
Time_marker = Time_marker + _month
Time_marker = Time_marker * 100
Time_marker = Time_marker + _day
Time_marker = Time_marker * 100
Time_marker = Time_marker + _hour
Time_marker = Time_marker * 100
Time_marker = Time_marker + _min
Hallo Uwe,
auf diese Art bekommst du die 5 Werte in einer Long untergebracht. Das Overlay macht aber dann keinen Sinn mehr, weil du nicht auf einzelne Teile deines Datums/Uhrzeit zugreifen kannst.
Es gibt dann zwei Arten, wieder an die einzelnen Teile zu kommen:

1. Über String zerlegen, ähnlich wie du das gemacht hast.
Time_marker_str = Str(Time_marker) 'Dies ist der aufwändige Part
Jahr_str = Mid(Time_marker_str,1,2)
Monat_str = Mid(Timer_marker,3,2) usw.

2. Umkehr der * 100 Operationen
Jahr = Time_marker / 100000000 'Jahr muss ganzzahlig dimensioniert sein, dies der aufwändige Teil
Rest = 100000000 * Jahr
Rest = Time_marker - Rest
Monat = Rest / 1000000 usw
Beides ist recht aufwändig, allerdings schaffst du es, die 5 Werte in einer Long unterzubringen.
Die erste Art ist sicherlich am einfachsten nachzuvollziehen.

Gibt es einen wichtigen Grund, warum du die 5 Werte in einer Long unterbringen willst?

Gruß

Sebastian
 
Nein. Wie gesagt, ich hab die Möglichkeit einem meiner Bücher entnommen. An die Daten rankommen, um sie zu benutzen, brauch ich nicht. Es geht nur um die Ausgabe auf dem Display. Gibts einen anderen oder besseren Weg, so einen Zeitstempel zu formulieren?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)