On Sun, Apr 21, 2013 at 3:21 PM, Roland Mainz <[email protected]> wrote:
> Another "typeset -m" issue... the following example doesn't work if
> function "sortar" is declared using "function sortar" instead of
> "sortar():
> -- snip --
> compound c=(
> compound -a ar=(
> ( float i=4 )
> ( float i=7 )
> ( float i=2 )
> ( float i=1 )
> ( float i=24 )
> ( float i=-1 )
> )
> )
>
> function sortar
> #sortar()
> {
> nameref ar=$1
> integer i
> integer -r i_max=${#ar[@]}
>
> bool swapped=true
>
> while $swapped ; do
> swapped=false
> for (( i=1 ; i < i_max ; i++ )) ; do
> if (( ar[i].i > ar[i-1].i )) ; then
> typeset -m "tmp=ar[i-1]"
> typeset -m "ar[i-1]=ar[i]"
> typeset -m "ar[i]=tmp"
> swapped=true
> fi
> done
> done
> return 0
> }
>
> # main
> set -o nounset
>
> sortar c.ar
>
> print -v c
> -- snip --
>
> AFAIK the demo should print...
> -- snip --
> (
> typeset -C -a ar=(
> [0]=(
> typeset -l -E i=24
> )
> [1]=(
> typeset -l -E i=7
> )
> [2]=(
> typeset -l -E i=4
> )
> [3]=(
> typeset -l -E i=2
> )
> [4]=(
> typeset -l -E i=1
> )
> [5]=(
> typeset -l -E i=-1
> )
> )
> )
> -- snip --
> ... but ast-ksh.2013-04-09 on SuSE 12.2/AMD64/64bit prints this:
> -- snip --
> $ ksh sortc.sh
> sortc.sh[38]: sortar: line 24: ar[i-1].i : parameter not set
> (
> typeset -C -a ar=(
> [0]=(
> typeset -l -E i=7
> )
> [2]=(
> typeset -l -E i=2
> )
> [3]=(
> typeset -l -E i=1
> )
> [4]=(
> typeset -l -E i=24
> )
> [5]=(
> typeset -l -E i=-1
> )
> )
> )
> -- snip --
Here's an updated version of the testcase which handles the
floating-point corner issues of { -nan/+nan, -inf, +inf }:
-- snip --
function sortar
#sortar()
{
nameref ar=$1
bool direction=$2
integer i
integer -r i_max=${#ar[@]}
float d
bool swapped=true
(( d=direction?+1.:-1. ))
while $swapped ; do
swapped=false
for (( i=1 ; i < i_max ; i++ )) ; do
if (( isnan(ar[i].i) ||
isgreater((ar[i].i - ar[i-1].i)*d, 0.)
)) ; then
typeset -m "tmp=ar[i-1]"
typeset -m "ar[i-1]=ar[i]"
typeset -m "ar[i]=tmp"
swapped=true
fi
done
done
return 0
}
function main
{
compound c=(
compound -a ar=(
( float i=4 )
( float i=2 )
( float i=-nan )
( float i=2 )
( float i=-inf )
( float i=1 )
( float i=24 )
( float i=+inf )
( float i=-1 )
)
)
sortar c.ar true
print -v c
}
# main
set -o nounset
main
-- snip --
AFAIK it should print:
-- snip --
$ ksh sortc.sh
(
typeset -C -a ar=(
[0]=(
typeset -l -E i=-nan
)
[1]=(
typeset -l -E i=inf
)
[2]=(
typeset -l -E i=24
)
[3]=(
typeset -l -E i=4
)
[4]=(
typeset -l -E i=2
)
[5]=(
typeset -l -E i=2
)
[6]=(
typeset -l -E i=1
)
[7]=(
typeset -l -E i=-1
)
[8]=(
typeset -l -E i=-inf
)
)
)
-- snip --
... but ast-ksh.2013-04-09 on SuSE 12.2/AMD64/64bit prints this:
-- snip --
$ ksh sortc.sh
sortc.sh[53]: main[46]: sortar: line 18: ar[i-1].i)*d, 0.)
: parameter not set
(
typeset -C -a ar=(
[0]=(
typeset -l -E i=4
)
[1]=(
typeset -l -E i=-nan
)
[3]=(
typeset -l -E i=2
)
[4]=(
typeset -l -E i=-inf
)
[5]=(
typeset -l -E i=1
)
[6]=(
typeset -l -E i=24
)
[7]=(
typeset -l -E i=inf
)
[8]=(
typeset -l -E i=-1
)
)
)
-- snip --
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) [email protected]
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 3992797
(;O/ \/ \O;)
_______________________________________________
ast-developers mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-developers