JASS loop iteration problem

xPheRe

New Member
Reaction score
43
Days ago I'd needed a loop to iterate over 16384 values.
So I wrote this code
Code:
local integer idx = 0
loop
    exitwhen idx >= 16384
    (do stuff)
    set idx = idx + 1
endloop
I was surprised when I executed it. The loop never reached the end.
I've tried to make the trigger writes on screen a message every time it processed 128 values to look at what index it hangs, so I wrote
Code:
local integer i = 0
local integer idx = 0
loop
    loop
        exitwhen i >= 128
        exitwhen idx >= 16384
        (do stuff)
        set idx = idx + 1
        set i = i + 1
    endloop

    exitwhen idx >= 16384
    call DisplayTimedTextToForce(GetPlayersAll(), 5.00, I2S(idx))
    set i = 0
endloop
It processed until 6528 and then ends. The map was running, but the loop hadn't end succesfully.
So I try to remove the message and call a polled wait instead.
Instead of DisplayTimedTextToForce... I wrote
Code:
call PolledWait(0.01)
Incredibly, it worked. It's a lot slower (even changing the 128 value to a 2048, because with 4096 I have the same problem) but it works...
There's anybody out there that can explain this weird behaviour to me????
It's annoying me :banghead:
 

phyrex1an

Staff Member and irregular helper
Reaction score
447
The only thing I can come up with is that if a thread gets to long it is interupdet/ended. Maybe a polled wait solves that behavor.

As far as i know there is no way to stop this in good way.

If you want it faster try this:

Code:
if ModuloInteger(idx, 6000) == 0 then
  call PolledWait(0.01)
endif


Depending on the situation: You realy should starting to use the GC it is alot faster that looping thrue 16000 vaules
 

xPheRe

New Member
Reaction score
43
I'm sure GC is fast, after all it was coded by well known professionals :shades:

I was only wondering why my copy/clear routines hang every time I need them to work over a large amount of data. It's undeniable that there's something on the system killing threads that expend too much time.

Anyhow, this faster way you proposed saves me time writing a couple of loops, but involves callings to other functions, thus I don't know if it's really faster.

Thanks anyway ;)
 
S

ShaiTan-Enk

Guest
If you want to loop over 16384 values, then you should exitwhen idx >= 16383, because you start from 0. I know this doesn't have much to do with your question, but it's just a thought.

P.S. Why does Blizzard use JASS instead of Java or Python or C++ or some well-known programming language? It would make it a lot easier to program it.
 

xPheRe

New Member
Reaction score
43
ShaiTan-Enk said:
If you want to loop over 16384 values, then you should exitwhen idx >= 16383, because you start from 0
It starts from 0 and it loops exactly 16384 times.
Notice that the stuff is done after check the condition.
ShaiTan-Enk said:
P.S. Why does Blizzard use JASS instead of Java or Python or C++ or some well-known programming language? It would make it a lot easier to program it.
Sure, it will be easier (for gurus of C++) if they let us to code maps in C++
But JASS is simpler and it only allows us to do what Blizzard wanted.

Imagine that Blizzard let us code a map in C++.
In two days, more or less, it will be released the first virus for WC3 Maps
In one week, dozens of different virus will spread all over BNET
It might be disastrous! :eek:
 
S

ShaiTan-Enk

Guest
That's true, but it would be so much fun - we would be able to do absolutely anything with the game :D
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top