Probleme mit Charpos und Instr bei Konstanten

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Probleme mit Charpos und Instr bei Konstanten

      Hallo, ich habe da ein kleines Problem was wohl auf den Compiler zurückzuführen ist. Ich wollte bei meiner Empfangsroutine um RAM zu sparen nur gültige Zeichen durchlassen. Dazu habe ich eine Konstante mit den Zeichen definiert und vergleiche das empfangene Zeichen per Charpos damit. So war der Plan. Aber der klappt so nicht, BASCOm meldet: Error : 31 Invalid data type.

      Source Code

      1. ' Mit DIM funktioniert es
      2. ' Dim Rec_ok_char As String * 12
      3. ' Rec_ok_char = "0123456789;{013}"
      4. ' Mit Const aber nicht
      5. Const Rec_ok_char = "0123456789;{013}"
      6. Dim Rec_char_c As String * 1
      7. Dim Rec_char As Byte At Rec_char_c Overlay
      8. Do
      9. Rec_char = Waitkey()
      10. If Charpos(rec_ok_char , Rec_char_c) > 0 Then
      11. ' mach was....
      12. End If
      13. Loop
      Display All
      Charpos als auch Instr aktzeptieren wohl nur Stringvariablen im RAM. Da ich aber mit dem RAM sparen muss
      such ich nun eine Alternative ohne den Code mit if-Abfragen oder Select Case-Anweisungen aufzublähen. Hat jemand eine bessere Idee?
      Dass der Vergleich mit String-Konstanten funktioniert wäre doch etwas, was Mark dem Compilre beibringen könnte? Liest der mit?
    • Bist du dir sicher, dass charpos weniger flash braucht, als if-Abfragen? ZB. in einer for next, mit Vergleichswerten aus datas? Charpos macht ja auch nix anderes, nur schleppt es noch einen Zähler mit.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo,
      entferne das Overlay Befehl .

      Dim Rec_char As Byte At Rec_char_c Overlay


      Overlay- Funktion kannst du im bestimmten Speicherposition definieren.

      Ach ja, schreibe an statt "Variable > 0" "Variable <> 0", um noch mehr Speicher zu sparen.
      Mit freundliche Grüße,

      Patrick Dreger
    • Hi

      mir fallen da 3 Dinge ein.

      1. Welcher Prozessor verwendest du, und wie hast du die Stackwerte und den Framesize definiert?
      Oft kann man da was rausholen.

      2. Man kann eine Funktion erstellen, die lokal einen String-Buffer bereitstellt. In der Funktion wird
      mit CharPos geprüft, und das Ergebnis zurück gegeben.

      BASCOM Source Code

      1. Function IsCharAllowed(Byval zeichen as Byte) as Byte
      2. local Buffer as String*11
      3. Buffer = Konstantwert ' hier Konstante zuweisen
      4. IsCharAllowed = CharPos(Buffer,zeichen) ' hier prüfen und Ergebnis zurück geben
      5. End Function

      3. Wenn man so eine Zeichen-Überprüfung braucht, kann man auch eine Select Case Anweisung verwenden.

      In deinem Fall

      BASCOM Source Code

      1. Select Case zeichen
      2. Case 0 to 0 ' Zahlen 0-9 erlaubt
      3. call Machwas()
      4. Case 13 ' Return erlaubt
      5. call Machwas()
      6. Case Else ' alles andere nicht erlaubt
      7. call NichtErlaubt()
      8. End Select
      Zeichen ist hierbei das zu prüfende Zeichen

      Noch ein Hinweis. Stringfunktionen wie Instr, Ucas, LCase, Trim, CharPos, etc. arbeiten mit Strings.
      Und Konstanten sind keine Strings. Mann kann Konstanten aber zur Verarbeitung in Strings laden.
      Kaum macht man es richtig - und schon geht's!