Your version using sequences works well. I wondered how an array version of 
that would look, so tried using your sequence version but with a ref array, ie: 
    
    
    ***************
    *** 12,15 ****
      proc main() =
    !   var a = newSeq[E](els)
    !
        for i in 0..high(a):
    --- 12,17 ----
      proc main() =
    !   var
    !     a: ref array[els, E]
    !
    !   new a
        for i in 0..high(a):
    
    ms:nim jim$ nim c sort4
    /Users/jim/nim/sort4.nim(17, 19) Error: type mismatch: got <ref 
array[0..9999999, E]>
    but expected one of:
    proc high(T: typedesc[SomeFloat]): T:type
      first type mismatch at position: 1
      required type for T: type SomeFloat
      but expression 'a' is of type: ref array[0..9999999, E]
    proc high(x: cstring): int
      first type mismatch at position: 1
      required type for x: cstring
      but expression 'a' is of type: ref array[0..9999999, E]
    proc high(x: string): int
      first type mismatch at position: 1
      required type for x: string
      but expression 'a' is of type: ref array[0..9999999, E]
    proc high[I, T](x: array[I, T]): I
      first type mismatch at position: 1
      required type for x: array[I, T]
      but expression 'a' is of type: ref array[0..9999999, E]
    proc high[I, T](x: typedesc[array[I, T]]): I
      first type mismatch at position: 1
      required type for x: type array[I, T]
      but expression 'a' is of type: ref array[0..9999999, E]
    proc high[T: Ordinal | enum | range](x: T): T
      first type mismatch at position: 1
      required type for x: T: Ordinal or enum or range
      but expression 'a' is of type: ref array[0..9999999, E]
    proc high[T: Ordinal | enum | range](x: typedesc[T]): T
      first type mismatch at position: 1
      required type for x: type T: Ordinal or enum or range
      but expression 'a' is of type: ref array[0..9999999, E]
    proc high[T](x: openArray[T]): int
      first type mismatch at position: 1
      required type for x: openArray[T]
      but expression 'a' is of type: ref array[0..9999999, E]
    
    expression: high(a)
    
    
    Run

I don't understand why high(a) works if the array isn't a ref array, but fails 
on a ref array. But to continue, I changed high(a) to ..< els. Then it didn't 
like sort: 
    
    
    /Users/jim/nim/sort4a.nim(20, 4) Error: type mismatch: got <ref 
array[0..9999999, E]>
    but expected one of:
    func sort[T](a: var openArray[T]; cmp: proc (x, y: T): int {.closure.};
                order = SortOrder.Ascending)
      first type mismatch at position: 1
      required type for a: var openArray[T]
      but expression 'a' is of type: ref array[0..9999999, E]
    proc sort[T](a: var openArray[T]; order = SortOrder.Ascending)
      first type mismatch at position: 1
      required type for a: var openArray[T]
      but expression 'a' is of type: ref array[0..9999999, E]
    
    expression: sort(a)
    
    
    Run

Shouldn't this change from array to ref array + new have worked?

Reply via email to