Jump to content

SOLVED - Declaring Number for Breaking Do ... Until loop


Siwa
 Share

Recommended Posts

Hi autoit community, 

I have a strange problem, I have a loop which checks something of a webpage created by IE, I want the code to stop until my desired condition is met( JavaScript-page fully loaded), but the loop continues forever despite that my condition is met.

Here is my DO...UNTIL loop I am stuck.

Total numbers =... ;Some java query which returns a number, I included the console.
$i = 0
Do
    $i += 1
    $Specific =... ;Some java query which returns a number, I included the console.
    $Specific_Numers = StringRegExp($Specific, '\d+(?:,\d+)?', 1)
    Sleep(10)
    ConsoleWrite (@CRLF & $i & " " & "Total numbers =" & $Total_Numbers & " Smaller size is =" & $Specific_Numers[0] )
Until $Total_Numbers >$Specific_Numers[0]

And here is part of my console

Spoiler

Total numbers = 
1 Total numbers =196 Smaller size is =3
2 Total numbers =196 Smaller size is =3
3 Total numbers =196 Smaller size is =3
4 Total numbers =196 Smaller size is =3
5 Total numbers =196 Smaller size is =3
6 Total numbers =196 Smaller size is =3
7 Total numbers =196 Smaller size is =3
8 Total numbers =196 Smaller size is =3
9 Total numbers =196 Smaller size is =3
10 Total numbers =196 Smaller size is =3
11 Total numbers =196 Smaller size is =3
12 Total numbers =196 Smaller size is =3
13 Total numbers =196 Smaller size is =3
14 Total numbers =196 Smaller size is =3
15 Total numbers =196 Smaller size is =3
16 Total numbers =196 Smaller size is =3
17 Total numbers =196 Smaller size is =3
18 Total numbers =196 Smaller size is =3
19 Total numbers =196 Smaller size is =3
20 Total numbers =196 Smaller size is =3
21 Total numbers =196 Smaller size is =3
22 Total numbers =196 Smaller size is =3
23 Total numbers =196 Smaller size is =3
24 Total numbers =196 Smaller size is =3
25 Total numbers =196 Smaller size is =3
26 Total numbers =196 Smaller size is =3
27 Total numbers =196 Smaller size is =3
28 Total numbers =196 Smaller size is =3
29 Total numbers =196 Smaller size is =3
30 Total numbers =196 Smaller size is =3
31 Total numbers =196 Smaller size is =3
32 Total numbers =196 Smaller size is =3
33 Total numbers =196 Smaller size is =3
34 Total numbers =196 Smaller size is =3
35 Total numbers =196 Smaller size is =3
36 Total numbers =196 Smaller size is =3
37 Total numbers =196 Smaller size is =3
38 Total numbers =196 Smaller size is =3
39 Total numbers =196 Smaller size is =3
40 Total numbers =196 Smaller size is =3
41 Total numbers =196 Smaller size is =3
42 Total numbers =196 Smaller size is =3
43 Total numbers =196 Smaller size is =3
44 Total numbers =196 Smaller size is =3
45 Total numbers =196 Smaller size is =3
46 Total numbers =196 Smaller size is =3
47 Total numbers =196 Smaller size is =3
48 Total numbers =196 Smaller size is =3
49 Total numbers =196 Smaller size is =3
50 Total numbers =196 Smaller size is =3

I know it is a very basic question, but I'm stuck at this code, and I guess I need some experts opinions for this.

Edited by Siwa
Link to comment
Share on other sites

23 minutes ago, Nine said:

Might be because, you are comparing string with number

Nine is correct.  
Try:

$Specific_Numers = Number(StringRegExp($Specific, '\d+(?:,\d+)?', 1))

btw, @Siwa, it could have been much worse; had the TotalNumbers been 396 instead of 196, the loop would have ended, and the bug might not have been detected right away...

Code hard, but don’t hard code...

Link to comment
Share on other sites

From the help;

"In AutoIt there is only one datatype called a Variant. if you try and multiply two variants they will be treated as numbers.  If a string is used as a number, an implicit call to Number() function is done. So if it doesn't contain a valid number, it will be assumed to equal 0."

In @Siwa's expression, $Total_Numbers has already been assigned a numeric value therefore $Specific_Numers will be automatically assigned a numeric value. Therefore, this isn't his issue.

Phil Seakins

Link to comment
Share on other sites

1 hour ago, pseakins said:

In @Siwa's expression, $Total_Numbers has already been assigned a numeric value therefore $Specific_Numers will be automatically assigned a numeric value.

Disagree.  Here, then:

Local $iNumber

$iNumber=50
ConsoleWrite("iNumber=50" &@CRLF)
If IsNumber($iNumber) Then 
   ConsoleWrite("Its a Number" &@CRLF)
Else
   ConsoleWrite("Its Not a Number" &@CRLF)
EndIf 

If IsString($iNumber) Then 
   ConsoleWrite("Its a String" &@CRLF)
Else
   ConsoleWrite("Its not a String" &@CRLF)
EndIf 

ConsoleWrite(@CRLF)

$iNumber="50"
ConsoleWrite("iNumber=""50""" &@CRLF)
If IsNumber($iNumber) Then 
   ConsoleWrite("Its a Number" &@CRLF)
Else
   ConsoleWrite("Its Not a Number" &@CRLF)
EndIf 

If IsString($iNumber) Then 
   ConsoleWrite("Its a String" &@CRLF)
Else
   ConsoleWrite("Its not a String" &@CRLF)
EndIf
iNumber=50
Its a Number
Its not a String

iNumber="50"
Its Not a Number
Its a String

 

Code hard, but don’t hard code...

Link to comment
Share on other sites

1 minute ago, GokAy said:

Hey all,

I did face an issue when a number was passed to a script as an argument, it would fail to interpret as a number, and had to convert to a number explicitly. Maybe something I did wrong, idk. (Just an AutoIt nooby after all :idiot: )

Can you recall the actual code?

Code hard, but don’t hard code...

Link to comment
Share on other sites

15 minutes ago, JockoDundee said:

Disagree.  Here, then:

What is your point? Yes, that is exactly how AutoIt works.

However, @Siwaalready told us that his variable $Total_Numbers is a number when he defined it in his pseudocode;-

"Total numbers =... ;Some java query which returns a number, I included the console."

It then follows that the other side of his expression will be automatically "Number() converted, as defined in AutoIt help. So, unless he is actually comparing strings (and we don't know that because we haven't seen all his code) his expression may fail without ">=".

Phil Seakins

Link to comment
Share on other sites

Yeah,

Maybe Number() would be enough, need it to be an integer though.

Example would be: 2 NO-OVERWRITE

Global $g_bGUI_MODE = True

if $CmdLine[0] = 0 Then
    ; Script started by User (no params needed)
    ; $g_iSampleCopies
    ; $g_sCopyMethod
Elseif $CmdLine[0] = 2 Then
    ; Script started by Excel (params required)
    $g_iSampleCopies = Int($CmdLine[1], $NUMBER_32BIT)
    $g_sCopyMethod = $CmdLine[2]

    ; Check if $g_iSampleCopies is an integer, terminate if not, then terminate if less than 1
    if not IsInt($g_iSampleCopies) then Exit
    if $g_iSampleCopies < 1 then Exit

    ; Check if $g_sCopyMethod is a valid parameter, terminate if not
    if StringInStr("DELETE OVERWRITE NO-OVERWRITE", $g_sCopyMethod) = 0 then Exit

    ; If all params are correct then set GUI_Mode = False
    $g_bGUI_MODE = False
Else
    ; Wrong number of params, abort!!!
    Exit
EndIf

 

Edited by GokAy
Link to comment
Share on other sites

 

26 minutes ago, pseakins said:

What is your point? Yes, that is exactly how AutoIt works.

However, @Siwaalready told us that his variable $Total_Numbers is a number when he defined it in his pseudocode;-

"Total numbers =... ;Some java query which returns a number, I included the console."

It then follows that the other side of his expression will be automatically "Number() converted, as defined in AutoIt help. So, unless he is actually comparing strings (and we don't know that because we haven't seen all his code) his expression may fail without ">=".

I don’t see how you can say that - he prints both variables right before the evaluation.

ConsoleWrite (@CRLF & $i & " " & "Total numbers =" & $Total_Numbers & " Smaller size is =" & $Specific_Numers[0] )
Until $Total_Numbers >$Specific_Numers[0]

And the output shows them as 196 and 3

Code hard, but don’t hard code...

Link to comment
Share on other sites

10 minutes ago, JockoDundee said:

And the output shows them as 196 and 3

To be honest, I hadn't even noticed the hidden console output.

Reviewing @Siwa's code I see that he is performing StringRegExp on something he is saying is a number. Clearly the value he is working with is actually a string. This then implies that, probably, both his variables are strings and of course "196" is LOWER than "3" in a string comparison.

@Siwa You need to perform a Number() conversion on one or both of the variables in your comparison expression. Only one is actually necessary as the other one will be converted by implication. Here is the corrected code. Note I have left in the ">="  rather than ">".

Until Number($Total_Numbers) >= $Specific_Numers[0]

 

Phil Seakins

Link to comment
Share on other sites

Thanks for your help, and in depth explanations guys.

As @pseakins said, the query returned a string, and that was my main problem. Those two variables were reading the same text inside a JavaScript webpage, the first variable read the whole total of incidences, and the second variable reads it after a search is done to lower the numbers and indicating that actually a search is done. 

The confusing part for me was, that the first number was read by autoit as a number, and when I put a is number if statement it accepted my statement.

But the strange part was autoit was not accepting my second variable as a number, and @GokAy was right, I had to declare it as a number with Number().

Link to comment
Share on other sites

16 hours ago, Siwa said:

The confusing part for me was, that the first number was read by autoit as a number

Incorrect, the number was read by AutoIt as a string. A string literal representation of a number.

16 hours ago, Siwa said:

and when I put a is number if statement it accepted my statement.

AutoIt will accept the comparison statement regardless of whether the variables are strings or numbers or any other datatype. When it comes to execution AutoIt then figures out what kind of Variants it is dealing with and then processes the statement accordingly.

So, to reiterate. 1. Both the variables were interpreted as strings, 2. The Until statement failed because it was doing a string comparison when you intended it to be a numeric comparison. 3. At least one of the variables needed to be Number() converted in order to force the comparison to be numeric. 4. It doesn't matter when the Number() conversion is performed - It can be within the Until expression, or it could have be done earlier on as @JockoDundee suggested upon the output of the StringRegExp expression. 5. If it were done earlier then doing it again within the Until expression would be redundant and unnecessary.

Personally, I think it makes the current code easier to understand if the conversion is performed during the Until expression.

However, if the variables were to be accessed separately, in other parts of code, yet to be written, it would be better practice to convert BOTH variables during the initial assignment. Maybe you should do this anyway so there is a clear understanding that you are working with number variants. To reinforce this I recommend using a naming convention where the first letters of the variable name define its type. Eg., $iTotalNumbers and $aiSpecificNumbers. Naming conventions are discussed here https://www.autoitscript.com/wiki/Best_coding_practices Having said that, I think it's still better to use $i an $j in loops and $x for a temporary variable. 

Phil Seakins

Link to comment
Share on other sites

My summary of accreditation, IMHO

1) Nine said “you’re comparing a string with a number”. Although, technically this was inaccurate, since actually it was a string compared to a string, it was the essence of the error and the first response as well, and therefore as is typical, earns 50%.

2) I said “Nine is correct.” Affirmations of true statements at best earn 25% of the original statement, which in this case was awarded 50% - therefore it earns a quarter of a half or 12.5%.

3) I posted some code purporting to be a solution.  Unfortunately, I overlooked that StringRegExp returns an array, therefore my Number() function would have an unknown, but certainly unhelpful effect if applied to the array directly.  Still, with a slight change it would have work - therefore I award it 2.5%

4) pseakins thought that the loop condition was not being reached, causing the infinite loop.  He had missed the output listing, which was hidden under a reveal - therefore I award him the nominal 5% “good faith” effort.

5) pseakins insists that there is no number/string typing issue, because he hadn’t seen the console output.

6) I post a pedantic string/numeric example, because I had seen the output, yet still earning 0% for irrelevance.

7)  pseakins looks at the output after I mention it, he concludes that both variables must be strings, since if even one is numeric, then the evaluation is numeric.  
totals:

Nine: 50%

pseakins: 35%

me: 15%

:)

Edited by JockoDundee

Code hard, but don’t hard code...

Link to comment
Share on other sites

  • Siwa changed the title to SOLVED - Declaring Number for Breaking Do ... Until loop

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...