[M3devel] subrange value not constant?

Jay jay.krell at cornell.edu
Thu May 21 08:43:56 CEST 2009


INC and DEC?
Oh for += and -=.
 
It's not just clarity though, it is also to avoid the cost of evaluating the expression twice.
 
 - Jay


----------------------------------------
> To: martinbishop at bellsouth.net
> Date: Wed, 20 May 2009 22:27:43 -0700
> From: mika at async.caltech.edu
> CC: m3devel at elegosoft.com
> Subject: Re: [M3devel] subrange value not constant?
>
>
> Martin, you have one bug: you don't initialize count. Per 2.6.9 in the
> Green Book, NEW returns "an arbitrary value of its type"
>
> Also, for slightly more clarity, count can be a REF ARRAY OF CARDINAL.
>
> INC and DEC would make the code a bit easier to read, perhaps.
>
> Finally, you can dispense with min and max completely by just using
> min, initialized to a[0], and re-allocating the array whenever the
> new value is greater than min + NUMBER(count^) :-) But maybe you
> already know what min and max are by some means that doesn't involve
> scanning the array.
>
> Mika
>
>
>
>
> Martin Bishop writes:
>>By the way, in case anyone cares, here's the proper code:
>>
>>PROCEDURE Sort(VAR a: ARRAY OF INTEGER; min, max: INTEGER) =
>> VAR range := max - min + 1;
>> count := NEW(REF ARRAY OF INTEGER, range);
>> z := 0;
>> BEGIN
>> FOR i := FIRST(a) TO LAST(a) DO
>> count[a[i] - min] := count[a[i] - min] + 1;
>> END;
>> FOR i := min TO max DO
>> WHILE (count[i - min]> 0) DO
>> a[z] := i;
>> INC(z);
>> count[i - min] := count[i - min] - 1;
>> END;
>> END;
>> END Sort;
>>
>>Martin Bishop wrote:
>>> I've written this procedure (an implementation of counting sort):
>>>
>>> PROCEDURE Sort(VAR a: ARRAY OF INTEGER; min, max: INTEGER) =
>>> VAR count := ARRAY [min..max] OF INTEGER {0, ..};
>>> z := 0;
>>> BEGIN
>>> FOR i := FIRST(a) TO LAST(a) DO
>>> count[i - min] := count[i - min] + 1;
>>> END;
>>> FOR i := min TO max DO
>>> WHILE count[i - min]> 0 DO
>>> a[z] := i;
>>> INC(z);
>>> count[i - min] := count[i - min] - 1;
>>> END;
>>> END;
>>> END Sort;
>>>
>>> However, when I try to compile I get:
>>>
>>> "../Counting.m3", line 8: subrange lower bound is not constant
>>> "../Counting.m3", line 8: subrange upper bound is not constant
>>>
>>> Line 8 is:
>>>
>>> VAR count := ARRAY [min..max] OF INTEGER {0, ..};
>>>
>>> I don't see what's wrong?
>>>
>>>


More information about the M3devel mailing list