www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik String filtern (BASCOM BASIC)


Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe folgendes Problem:
Ich habe einen String, der folgendermaßen aussieht:

<A><C><K><CR><1><SP><1><SP><8><7><SP><1><4><3><CR>

Jedes Zeichen in < > sind ASCII-Zeichen, darunter auch 2 nicht-druckbare 
(CR und SP).

Ich will nun die Zahlen aus dem String herausfiltern und jede Zahl in 
einer extra Stringvariablen abspeichern. Das Problem welches nun 
hinzukommt ist, dass die Zahlen nicht fix sind, alle anderen Zeichen 
jedoch schon.

Sprich, der String könnte auch so aussehen:

<A><C><K><CR><1><3><SP><4><1><SP><1><8><7><SP><4><3><CR>


Ich habe schon eine gute Weile überlegt aber eine richtig gute 
Angehensweise habe ich nicht gefunden. Meine Lösung wäre, die ersten 3 
Zeichen erstmal wegzuschneiden (<A><C><K><CR>) und dann für jedes 
Zeichen extra eine Fallunterscheidung zu machen ob es eine Zahl ist.

Aber vielleicht weis ja einer on euch wie es einfacher geht :)

Autor: Avr Nix (avrnix) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn deine Zahl immer eine feste Position hat würde ich sagen mit MID 
Befehl die Zahl auschneiden.


http://www.comwebnet.de - Bascom AVR Projekte

Autor: Harry Up (harryup)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
die sprache dabei ist eigentlich egal, du kannst die einzelnen strings 
innerhalb der klammern mit der funktion 'val(string)' auf ihren 
numerischen wert untersuchen, dann bekommst du raus, welcher einer zahl 
entspricht.
grüssens, harry

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich bin die Sache nun folgendermaßen angegangen, hier der Code:

Definitionen:

Dim received_char_len As Byte
Dim schleifenvar As Byte
Dim received_char_split As String * 1
Dim Cmu_vw_array As String * 30


  '***** String filtern*****
  received_char_len = Len(received_char)
  received_char_len = received_char_len - 1     'wegen dem <CR> am Ende

  For schleifenvar = 5 To received_char_len
    received_char_split = Mid(received_char , schleifenvar , 1)

    Select Case received_char_split
       Case "0" : Mid(cmu_vw_array , schleifenvar , 1) = "0"
                   Print #2 , "0";              'Zur Kontrolle
       Case "1" : Mid(cmu_vw_array , schleifenvar , 1) = "1"
                   Print #2 , "1";
       Case "2" : Mid(cmu_vw_array , schleifenvar , 1) = "2"
                   Print #2 , "2";
       Case "3" : Mid(cmu_vw_array , schleifenvar , 1) = "3"
                   Print #2 , "3";
       Case "4" : Mid(cmu_vw_array , schleifenvar , 1) = "4"
                   Print #2 , "4";
       Case "5" : Mid(cmu_vw_array , schleifenvar , 1) = "5"
                   Print #2 , "5";
       Case "6" : Mid(cmu_vw_array , schleifenvar , 1) = "6"
                   Print #2 , "6";
       Case "7" : Mid(cmu_vw_array , schleifenvar , 1) = "7"
                   Print #2 , "7";
       Case "8" : Mid(cmu_vw_array , schleifenvar , 1) = "8"
                   Print #2 , "8";
       Case "9" : Mid(cmu_vw_array , schleifenvar , 1) = "9"
                   Print #2 , "9";
      Case Else : Mid(cmu_vw_array , schleifenvar , 1) = " "
                   Print #2 , " ";
   End Select

   Waitus 10
 Next schleifenvar

Die Variable cmu_vw_array soll später die einzelnen Zahlen in einem 
String speichern und sie mit einem Leerzeichen trennen.

Wenn ich mir mit dem Logic Analyzer die Print-Befehle anschaue passt das 
soweit. Aber die Zuweisung

Mid(cmu_vw_array , schleifenvar , 1) = "9"

funktioniert nicht. Da bekomme ich nichts brauchbares zusammen...
Wie kann ich das umschreiben?

Autor: avrnix = Spammer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Avr Nix ist ein Spammer

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mid(cmu_vw_array , schleifenvar , 1) = "9"

kann auch nicht gehen, da MID 1 Zeichen des cmu_vw_array an der Stelle 
schleifenvar zurückliefert. Es setzt keine Strings zusammen.

Das einfachste wäre so:

for i = 1 to received_char_len
    if mid(received_char,i,1) >= "0" and mid(received_char,i,1) <="9" 
then cmu_vw_array = cmu_vw_array + mid(received_char,i,1)
next i

Zumindest funktioniert das so oder ähnlich in verschiedenen 
PC-Basic-Dialekten.
Du solltest dir die Stringverarbeitung von Bascom mal ansehen...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.