Home   Help Search Login Register  

Author Topic: Interesting behaviour when putting commands in arrays...  (Read 2788 times)

0 Members and 1 Guest are viewing this topic.

Offline General Barron

  • Former Staff
  • ****
  • Semper Fi!
I was fiddling around, and I just noticed the following:

If you place a script command in an array, then the command will be executed, and a "<null> value will be placed in that spot in the array. For example:

Code: [Select]
a = [player setdammage 0.999, 34, "string"]
hint format ["%1", a]

This will do the following: set the player to 0.999 dammage, then display:

[<null>, 34, "string"]

Has anyone else noticed this? More importantly, has anyone put this to some kind of good use?
I don't really think it's very usefull, but I found it interesting and so I asked.

*edit* changed title
« Last Edit: 29 Jan 2004, 00:08:36 by General Barron »
HANDSIGNALS COMMAND SYSTEM-- A realistic squad-control modification for OFP
kexp.org-- The best radio station in the world, right here at home! Listen to John Richards!

Offline LCD

  • Former Staff
  • ****
    • Everon Cartel
Re:Putting commands in arrays
« Reply #1 on: 28 Jan 2004, 11:16:30 »
lol ;D

i dont think deres nythin usefull 2 do w/ dis  :-\ (if i wanna set somin i can write it out wenever i want no need 4 script ;))

but its realy interestin ;D

LCD OUT
"guess being the community has downsides .." - cheetah
Help Perfecting Da Next Best Thing - O-Team Beta

Offline Chris Death

  • Former Staff
  • ****
  • Finally Death's gonna get ya
    • OFPEC
Re:Putting commands in arrays
« Reply #2 on: 28 Jan 2004, 11:42:24 »
hmm - isn't there something like:

put the command itself into a string (make quotation marks
around it), and then CALL dat string

~S~ CD
Dont argue with idiots....they will bring you down to their level and beat you there with experience.

How to use Waypoint type Scripted

Offline Skumball

  • Members
  • *
Re:Putting commands in arrays
« Reply #3 on: 28 Jan 2004, 13:34:17 »
Or maybe you have to use double quotes for the hint as it cannot display a command?:

hint format ["{%1}", a]

Offline Chris Death

  • Former Staff
  • ****
  • Finally Death's gonna get ya
    • OFPEC
Re:Putting commands in arrays
« Reply #4 on: 28 Jan 2004, 14:21:14 »
Quote
Or maybe you have to use double quotes for the hint as it cannot display a command?:

For some reason i don't believe, that General Barron's not
trying to display commands, rather than trying to store pre
defined commands into an array, just to be able to execute
them upon a result of array selectors, he made somewhere in
a script  :)

~S~ CD
Dont argue with idiots....they will bring you down to their level and beat you there with experience.

How to use Waypoint type Scripted

Offline Spinor

  • Members
  • *
  • I'm a llama!
    • The chain of command
Re:Putting commands in arrays
« Reply #5 on: 28 Jan 2004, 14:33:35 »
I think this is normal behavior for commands that have no return value (hence the <null>). If one would insert
a command with a return value this would be placed in the array.

Here's a little trick using commands in an array I find useful sometimes

_codeArray =
[
{code0},
{code1},
{code2}
];

call (_codeArray select _i);

Depending on _i (0,1,2) one can execute one of the code strings, avoiding intricate if..then..else constructions.
Effectively, this simulates the C switch command.

Offline Chris Death

  • Former Staff
  • ****
  • Finally Death's gonna get ya
    • OFPEC
Re:Putting commands in arrays
« Reply #6 on: 28 Jan 2004, 15:19:16 »
Anybody remember my first reply?

Thanks Spinor for approving that and for the right syntax.

It's just that i wasn't using that method yet, and i always try
to avoid  posting syntax, not tested by me.

~S~ CD
Dont argue with idiots....they will bring you down to their level and beat you there with experience.

How to use Waypoint type Scripted

Offline General Barron

  • Former Staff
  • ****
  • Semper Fi!
Re:Putting commands in arrays
« Reply #7 on: 29 Jan 2004, 00:06:44 »
Thanks for the replies :) I know that you can store commands as strings and then use the "call" command in that way. I realize now that my subject line was kinda misleading.... I've changed it now.

Really I was just pointing out this sort of odd behaviour that I noticed sort of by accident. It seems like it should throw you an error, but in fact it does not. I think it's kinda wierd, because it, in effect, allows you to execute multiple commands in the same line of code. Like I said, I doubt it't usefull, but some it raises some interesting questions, such as what would happen if you did something like this:

Code: [Select]
_array = [95, "blah blah", goto "next", 35]
exit
#next
hint format["%1", _array]

What would happen? Would you get an error? Would you crash OFP? Would something be stored into _array, then the script exit? Would it jump to #next? If so, what would be the value of _array? Would it be [95,"blah blah", <null>, 35] or would it be [95,"blah blah", <null>]?

I'm sure you could come up with other strange and interesting questions, which is why I pointed this out.
« Last Edit: 29 Jan 2004, 00:09:25 by General Barron »
HANDSIGNALS COMMAND SYSTEM-- A realistic squad-control modification for OFP
kexp.org-- The best radio station in the world, right here at home! Listen to John Richards!

Offline Chris Death

  • Former Staff
  • ****
  • Finally Death's gonna get ya
    • OFPEC
Re:Interesting behaviour when putting commands in arrays...
« Reply #8 on: 29 Jan 2004, 00:29:56 »
Quote
what would happen if you did something like this:

_array = [95, "blah blah", goto "next", 35]
exit
#next
hint format["%1", _array]

Can't test this right now (@work  :-\), but this example
looks to me as it stores something into _array, and
then exits.

Maybe the result would change when using the hint format
also before the exit statement, but this way i'm sure the
script just exits after defining the array.

:edit - ouch - seems i understand now (yeah i'm late, but
i've only slept 2 1/2 hours since tuesday).

You mean that storing a command in an array already executes
that command - hmm - can't either think of any use for that yet.
Maybe after i've got some more time to sleep.

~S~ CD
« Last Edit: 29 Jan 2004, 00:34:00 by Chris Death »
Dont argue with idiots....they will bring you down to their level and beat you there with experience.

How to use Waypoint type Scripted

Offline Spinor

  • Members
  • *
  • I'm a llama!
    • The chain of command
Re:Interesting behaviour when putting commands in arrays...
« Reply #9 on: 29 Jan 2004, 15:39:00 »
Quote
Really I was just pointing out this sort of odd behaviour that I noticed sort of by accident. It seems like it should throw you an error, but in fact it does not. I think it's kinda wierd, because it, in effect, allows you to execute multiple commands in the same line of code.
What is so weird about that? You can already do that with semicolons. Anyway, with most commands I find this "commands in array" behaviour logical because most commands have a return values that can be inserted again into other commands/expressions. When the scipt interpreter finds a command in an array it evaluates it (+ maybe causing any side effects like setpossing) and puts its return value (if any) into the array. E.g. you probably agree that there is nothing odd about this one:
_array = [1,2*2,3*3]
although the multiplication operater is also a scripting command. After all, scripting commands are operators that take 0/1/2 parameters as input and return 0/1 variables as output.

Admittedly, your goto "next" example is quite strange but I think the following "commands" behave a little different:
?(cond):command, goto, #, ~, @
They are more script-flow-control-commands than proper scripting commands. Thats probably also the reason why the cannot be used in functions.

Offline MachoMan

  • Honoured
  • Former Staff
  • ****
  • KISS, Keep it Simple Stupid
Re:Interesting behaviour when putting commands in arrays...
« Reply #10 on: 29 Jan 2004, 16:00:55 »
U cannot put commands in an array like this.

What u are doing here is calling a function in an array. So when it reaches the array the interpreter will execute the given code, expecting the function to have a return value wich will go in the array. But this function does not have a return function, so the value is null. Because the variable is not defined.

Now it doesn't trow an error, because we do not have a compiler!
We only have a interpreter, wich has no way of scanning the code for errors.
It will just start executing any code and if an error occours it trows it. Seeing null is a excepted value, nothin happens.
An error will appear if u try to "do stuff" with the array, because most functions have no way of dealing with null values. This is what the interpreter will notice.
« Last Edit: 29 Jan 2004, 16:07:50 by MachoMan »
Get those missions out there you morons!

Offline Chris Death

  • Former Staff
  • ****
  • Finally Death's gonna get ya
    • OFPEC
Re:Interesting behaviour when putting commands in arrays...
« Reply #11 on: 29 Jan 2004, 16:03:17 »
Yeah, after having some sleep, i woke up with more clear
thoughts today  :D

General Barron, i came to a similar conclusion like Spinor here.

What you figured out is not any miracle behaviour of arrays
or so - it's just simple math's (well maybe not simple, but
still algebra)

In german language, this phenomenon is called: "Gleichung"
or "Aequivalenzumformung", what i could find in the dictionary
as: "equation".

The way, you have build your array is the same, as if you would
say:

a = 1 + 4

(result is 6  ;D) - nah - result is 5, however, a = 1 + 4 is a true
equation.

The operation 1 + 4 will become executed, once the interpretor
comes to this line, and this just for the fact that it will check
wether this is a "true" equation, or a "false" equation.

In case of a false equation, i would even expect an error message popping up.

Instead of: a = 1 + 4, you could also say: 10 - 5 = 1 + 4
result is "true"

Now you say: a = [player setdammage 0.999]

I could imagine that you get the same effect, in case you
make that line:
player setdammage (1 - 0.001) = player setdammage 0.999

hope this didn't make it more complicated now  ;D

~S~ CD
Dont argue with idiots....they will bring you down to their level and beat you there with experience.

How to use Waypoint type Scripted

Offline Spinor

  • Members
  • *
  • I'm a llama!
    • The chain of command
Re:Interesting behaviour when putting commands in arrays...
« Reply #12 on: 29 Jan 2004, 16:14:43 »
Hi Chris,
I think in OFP scripting terms you are referring to the equality operator '=='? I think your setDammage example would give an error.

One construction I found quite odd first is this
_bool = _value1 == _value2
but again, the '==' operator simply takes two parameters (e.g. float numbers) and returns a boolean true/false. This is then assigned to _bool with the '=' operator

Offline Chris Death

  • Former Staff
  • ****
  • Finally Death's gonna get ya
    • OFPEC
Re:Interesting behaviour when putting commands in arrays...
« Reply #13 on: 29 Jan 2004, 16:55:19 »
Yeah Spinor,

i just made some tests, and figured out that OFP's engine is
a little bit mixed up, when it comes to such operations.

a = player setdammage 0.999
hint format ["%1",a]

makes the player go prone (bloody)

while:

player setdammage 0.999 = player setdammage (1 - 0.001)

makes nothing but : error unknown operator

But then again i tried another thing:

a = (player setdammage (getdammage player + 0.48) == player setdammage (getdammage player + 0.48))

hint format ["%1",a]

This time it made the player go prone (bloody), what means
the both setdammage commands have become executed,
as getdammage player + 0.48 executed one time would
not make him prone (i remember the prone line to be around
0.9 or so).

Result of the hint was: scalar bool array string 0xfcffffef

While i also tried:

b = (1 + 5) == (2 + 4)
hint format ["%1",b]

Result was: true
showed as a hint

and:

b = (1 + 5) == (2 + 5)
hint format ["%1",b]

Result was: false

So it looks like OFP understands math equations, but not
logical ones, like i did with the commands.

Off course it's true what you said Spinor about my last reply,
but without testing that, i was just trying to explain where
this "strange behaviour" in arrays is comming from.

And in case of assigning a command to an array or variable,
it still makes some sense what i said above (it's just that
it's also hard for me to talk about algebra in a language, i weren't born with).

Summary:

a = command
or
a = math operation

will do the same thing

a will be the result of the stuff after "=", what means
operation will be executed and then assigned to be: a

It's just that you are limited in some ways, so that it's
not possible to assign everything you want to a.

hope if somebody reads that, it still makes sense, as i'm
not sure, if i got lost somewhere between my sentences  ;D

:edit - btw - General Barron u bugger,
i just figured out that u made me loose two hours of my day,
just to find out something i don't really find to be useful in
any way   :o

 ;)

Nah m8 - it's always good to take a look behind the scene,
that helps sometimes understanding why some things do
not work, and other do. :D  8)


~S~ CD
« Last Edit: 29 Jan 2004, 17:00:21 by Chris Death »
Dont argue with idiots....they will bring you down to their level and beat you there with experience.

How to use Waypoint type Scripted

Offline General Barron

  • Former Staff
  • ****
  • Semper Fi!
Re:Interesting behaviour when putting commands in arrays...
« Reply #14 on: 29 Jan 2004, 22:29:07 »
@Spinor

I see your point, but the reason why I didn't think of it as the game trying to evaluate an assignment operation is that if you try typing something like:

a = hint "ok"

Into a field in the editor, such as an init field or a trigger, the editor won't let you do it, because basically it says that the command doesn't provide a return type. Checking now, I realize that the above statement will run just fine from a script, placing a null in a and giving no errors. But it was the editor thing that was in my head and threw me off...
HANDSIGNALS COMMAND SYSTEM-- A realistic squad-control modification for OFP
kexp.org-- The best radio station in the world, right here at home! Listen to John Richards!