Thanks for all your help. I have some sample code:

Dynamic[entE1]

Dynamic[entS1]

entE1 = 3000;

entS1 = 0;

SetAttributes[setEnergy, HoldAll]

setEnergy[x_, entE_, entShields_] :=

Module[{newE = entE, newS = entShields, tot},

tot = entE + entShields;

newE = (1 - x)*tot;

newS = x * tot;

(*

executing these lines updated variables passed.

numbers are passed, we get an error

*)

entE = newE;

entShields = newS;

Style[StringForm[

"percentage is is : `` \r Ent Energy is ``\r shields: ``",

NumberForm[x, 4], NumberForm[newE, 4], NumberForm[newS, 4]], 12,

Blue, FontFamily -> "Courier New"]]

val2FromSlider[myX_] := Module[{limits}, limits = 1;

Slider[myX, {0, limits}]]

showValue[x_] :=

Style[StringForm["value is : `` ",

NumberForm[x, 4, NumberSigns -> {"-", "+"}]], 12, Blue,

FontFamily -> "Courier New"]

{val2FromSlider[Dynamic[eEn]], showValue[Dynamic[eEn]],

Dynamic[setEnergy[eEn, entE1, entS1]], Dynamic[entE1],

Dynamic[entS1]}

This is a toy example of what I want to do. There are separate functions. One does the UI part, using a slider to set a percentage. There is a function that uses the current values of entE1 and entS1 to cumpute new values of the variables using the percentage eEn. The display code in setEnergy[] is there for debugging purposes.

This code works as written.

I tried to have setEnergy[] return the new values of entE1 and entS1, but if I did so, they were not dynamically updated. I tried wrapping Dynamic around the returned variables, to no avail. (I thought that this approach would work.)

I tried some other variations without much success.

As I said, this version works, and I can apply it to my real code. I would like to know if there is a more elegant solution.

Thanks.