[Gambas-user] Swap expressions with side effects
Tobias Boege
taboege at ...626...
Sat Jan 11 19:05:49 CET 2014
Hi,
I just spent two good hours over my implementation of an algorithm to
arrange some PointFs in an array so that the distance between P[i] and
P[i+1] is the smallest possible among all points P[j], j > i. I don't
want to bother you with details (well, I think I already did, sorry) but
the comparison of two points is not only a function of these two points
but also of some other reference point. So I used a line like this:
Swap $aPoints[iInd + 1], $aPoints[GetNearest(iInd)]
which means: get me the index of the nearest point to $aPoints[iInd] and
swap $aPoints[iInd + 1] with the value there. This effectively sorts my
array into the desired order (For iInd = 0 To $aPoints.Max - 1).
Well, not really. Because Swap is not immune to side effects induced by
the expressions to swap. The wiki states that implicitly by saying that
Swap A, B
is equivalent to
tmp = A
A = B
B = tmp
So my code really was:
tmp = $aPoints[iInd + 1]
$aPoints[iInd + 1] = $aPoints[GetNearest(iInd)]
$aPoints[GetNearest(iInd)] = tmp
which leads to an erroneous array because GetNearest() is a function of
$aPoints[iInd + 1] which changed between the two invocations. [ The funny
thing is that, due to the nature of GetNearest(), the result of the above
three lines for all iInd is that the array remains unchanged. ]
To cut a long story short, is this by design? Do you think it's worth
changing that behaviour (it wouldn't break any sane use of Swap)? If not
it's equivalently fine. I'll add a clear warning to the wiki, then.
Regards,
Tobi
--
"There's an old saying: Don't change anything... ever!" -- Mr. Monk
More information about the User
mailing list