• Not Not (2002 SP3)

    Author
    Topic
    #419705

    That is very strange indeed. Boolean variables aren’t supposed to behave that way. Is the behavior consistent. i.e. does it persist after a reboot of your PC?

    Viewing 1 reply thread
    Author
    Replies
    • #948500

      Still there after a reboot.
      The attached worksheet contains a small piece of test code. Obviously you can’t run it unless you have IBM Personal Communications on your PC.

      Sheets 1 to 3 show results of 3 tests:

      Sheet 1:
      With a timeout of 1000 milliseconds, oia.waitforinputready() returns False.
      You can see that ir = False and Not ir = True
      This is as expected.

      Sheet 2:
      With a timeout of 10000 milliseconds, oia.waitforinputready() returns True.
      You can see that ir = True and Not ir = True
      This is NOT as expected

      Sheet 3:
      Setting ir to True explicitly (even though with a timeout of 10000 milliseconds it would already have been True) gives us:
      ir = True and Not ir = False
      Once again as expected.

      • #948504

        I don’t have that software, so I can’t test it.

        • #948528

          I didn’t think you would have, that was why I inserted the 3 pictures into the workbook.

          A very strange situation!

          • #948532

            The pictures don’t shed more light on the situation, I’m afraid. shrug

          • #948537

            This is a declaration and a type conversion problem.

            I spotted that not all variables are dim’ed in your code.

            I think the IBM code is not returning a boolean value. Since you haven’t dim’ed ir, it is by default a Variant and when assigning a value to it, it will accept any format.

            Consider these three small routines:

            Option Explicit
            
            Sub test1()
                Dim nir As Boolean
                Dim ir As Variant
                ir = 1
                nir = Not ir
                MsgBox nir
                ir = 0
                nir = Not ir
                MsgBox nir
            End Sub
            
            Sub test2()
                Dim nir As Boolean
                Dim ir As Variant
                ir = True
                nir = Not ir
                MsgBox nir
                ir = False
                nir = Not ir
                MsgBox nir
               
            End Sub
            
            Sub test3()
                Dim nir As Boolean
                Dim ir As Boolean
                ir = 1
                nir = Not ir
                MsgBox nir
                ir = 0
                nir = Not ir
                MsgBox nir
            End Sub
            

            See what I mean?

            • #948543

              I didn’t Dim it in the attached workbook, but if you look at the picture in the first append, I did have them Dimmed as Boolean and it was still exhibiting the behaviour.

              Also a Debug.Print of oia.waitforinputready(n) returns True or False.

              Bottom line is, is there some way that I can code this to make a working True/False value?

            • #948545

              No idea if it will help, but you could try

              ir = CBool(oia.waitforinputready(10000))

              It shouldn’t matter, but who knows?

            • #948557

              Well coding the Cbool() changes things.

              ir = CBool(oia.waitforinputready(10000))
              nir = Not ir

              Ends up with ir = True and nir = False

              But

              ir = Not CBool(oia.waitforinputready(10000))
              nir = Not ir

              Still has ir = True and nir = True

            • #948560

              You’ll have to live with the first one then.

              PS I would follow Jan Karel’s suggestion to clean the code. Even if it doesn’t solve your problem, it’s still useful.

            • #948604

              It occurred to me to wonder if

              nir = (ir = False)

              would give you the same problem, but I won’t blame you if you don’t want to spend another minute on this issue.

            • #948885

              Hi Paul,
              Just as a matter of interest, does it help if you move the oia.waitforinputready call into a separate function which explicitly returns a boolean? The fact that it always seems to work when the function returns false (which has to be zero) but not when it returns true does seem to imply that it is not returning a real boolean value, but some sort of number; hence when you apply Not, you’re flipping the bits but still ending up with a number other than 0, so getting a true value. I am confused though as to why the assignment to a boolean variable does not force the values to be true booleans.

            • #948901

              [indent]


              I am confused though as to why the assignment to a boolean variable does not force the values to be true booleans.


              [/indent]

              Yes, but stranger than that is, if you look at my post 480946, that it DOES work, but only if I do not try to use Not in the same statement.

            • #948552

              I missed the Dim in the picture.
              But since my code does show a similar behaviour, I think Hans’ suggestion might help (explicitly converting to a boolean before assigning).

              Last thing to try: clean your code! http://www.appspro.com/Utilities/CodeCleaner.htm%5B/url%5D

    • #948460

      Edited by StuartR to reduce size of graphic

      I am seeing some very strange behaviour when writing a programmed operator using VBA in Excel. I wonder if anyone can explain it.

      The programmed operator is using OLE to interact with an IBM Personal Communications 3270 emulator.

      One ofthe methods available is WaitForInputReady for which the documentation says:

      Method: Boolean WaitForInputReady

      The WaitForInputReady method waits until the OIA of the connection associated with autECLOIA object indicates that the connection is able to accept keyboard input

      Input Parameters:

      • #948490

        Does the result change if you take the parens out from Not (ir) and execute it as Not ir ? I have run into situations where a Not condition always returned true in other VBA implementations and in those circumstances, I have been forced to use workarounds like while loops or If-Else constructs.

      • #948572

        I have a vague sense of unease that this is similar to a problem that plagued me with hex values recently.

        Sometimes -1 and &HFFFF and True and False and zero and not-zero don’t seem to connect properly.

        Could it be that some specific bit pattern (length of bit string AND their values) is given a different interpretation by different code? We have all met mis-matched specs where “0” means not a problem and 0 means a problem. Or >=0 means “found” and -1 means not-found. But -1 means True, right? so something that treated -1 as True might be mis-interpreting a not-found response and thinking that everything is OK.

        I noticed a reply (480920) that mentioned problems with variants.

      • #948632

        I was just browsing around and came across this. dizzy

        I haven’t had time to read it or certainly to digest it but it might have some bearing on your problem/this thread.

        shrug

    Viewing 1 reply thread
    Reply To: Not Not (2002 SP3)

    You can use BBCodes to format your content.
    Your account can't use all available BBCodes, they will be stripped before saving.

    Your information: