Möglicher Fehler in Bascom 2082 mit der Funktion INSTR

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

    • Möglicher Fehler in Bascom 2082 mit der Funktion INSTR

      Folgendes ist mir heute aufgefallen.
      Gegeben sei folgende Zeichenkette die sich in der Variablen cREC befindet:

      Source Code

      1. OK
      2. +CMGR: "REC READ","6700",,"2019/07/12,07:54:16+02"
      3. Service Team

      Die Funktion ist folgendermaßen aufgebaut:

      BASCOM Source Code

      1. Function CheckSMSpos(ByVal pStartPos As Byte) As Byte
      2. Local fS As String * 1
      3. fS = Chr(34)
      4. Incr pStartPos
      5. print #2 , "P0:" ; str(pStartPos);
      6. If pStartPos <> 0 Then
      7. SMS_Pos1 = Instr(pStartPos , cREC , "{034}")
      8. print #2 , " / P1:" ; str(SMS_Pos1);
      9. If SMS_Pos1 <> 0 Then
      10. Incr SMS_Pos1
      11. SMS_Pos2 = Instr(SMS_Pos1 , cREC , "{034}")
      12. print #2 , " / P2:" ; str(SMS_Pos2);
      13. If SMS_Pos2 = 0 Then
      14. SMS_Pos1 = 0
      15. End If
      16. End If
      17. Else
      18. SMS_Pos2 = 0
      19. End If
      20. print #2 , ""
      21. print #2 , cREC
      22. If SMS_Pos1 = 0 Or SMS_Pos2 = 0 Then
      23. CheckSMSpos = 0
      24. Else
      25. CheckSMSpos = 1
      26. End If
      27. End Function
      Display All


      Die Abfrage lautet folgendermaßen:
      SMS_Pos1 = Instr(pStartPos , cREC , "{034}")
      Die Version 2081 liefert richtig
      P0:1 / P1:17 / P2:26
      Die neue Version 2082 liefert aber falsch
      P0:1 / P1:0
      findet also den Charakter 34 (das Anführungszeichen) nicht im String.

      Als Workaround habe ich aktuell
      fS = Chr(34)
      SMS_Pos1 = Instr(pStartPos , cREC , fS)
      dann liefert auch die Version 2082 die korrekte Position.

      Eine Anmerkung noch, nicht verwirren lassen, die oben angegeben zurückgelieferten Positionen stimmen, da im zu durchsuchenden String auch noch Steuerzeichen (CRLF) enthalten sind die ja auch mitgezählt werden!
    • Mitch64 wrote:

      Im Grunde genommen stellt der Ausdruck "{034}" eine Stringkonstante mit 5 Zeichen dar.
      Ja, aber meiner Meinung nach, sollte der Compiler daraus dann eben das eine Zeichen machen (und hat es ja auch bisher so gemacht).
      Diese Schreibweise soll doch IMHO nur ein Komfort beim Programmieren darstellen und sonst nichts weiter.
      Erst mit der neuen Version von BasCom stellt sich dieses IMHO falsche Verhalten dar.
      Und diese Schreibweise wurde zumindest bisher auch beim Print-Befehl genau so verwendet und funktioniert auch aktuell.
    • Ich verstehe deine Argumentation.

      Aber angenommen jemand wollte tatsächlich nach diesem Sting "{034}" suchen wollen, wie soll man das dem Compiler mitteilen? Stichwort Escape-Zeichen.

      In C ist z.B "\n" ein NewLine.
      Sollte aber wirklich ein Backslash und ein n ausgegeben werden, müsste "\\n" geschrieben werden.

      Sowas in der Art bräuchte dann Bascom.

      Ich sehe jetzt da eingentlich keinen Fehler. Aber kannst ja mal Mark fragen, wie er argumentiert.
      Wäre mal interessant.
    • Ich habe jetzt mal ein kleines Testprogramm für 2.0.8.2 geschrieben.

      BASCOM Source Code

      1. $Regfile = "m8def.dat"
      2. $Crystal = 8000000
      3. Dim QuellString as String * 20
      4. Dim SuchString as String * 20
      5. Dim ErgebnisString as String * 20
      6. Dim Pos as Byte
      7. QuellString = "abc " + chr(34) + "def" + chr(34) + " ghi {034} jkl"
      8. SuchString = "{034}"
      9. Pos = Instr(Quellstring , Suchstring)
      10. Print QuellString
      11. Print SuchString
      12. Print Pos
      13. End ' da keine Hauptschleife
      Display All

      Dann kommt das korrekte Ergebnis:

      Heraus kommt das:
      Inhalt QuellString: abc "def" ghi " jkl
      Inhalt SuchString: "
      Pos: 5

      Wenn ich die Zeile 11 so abändere:

      BASCOM Source Code

      1. Pos = Instr(Quellstring , "{034}")

      dann kommt falsches Ergebnis:
      Inhalt QuellString: abc "def" ghi " jkl
      Inhalt SuchString: "
      Pos: 0

      Ich kann also deinen Fehler nachvollziehen.