[Openmcl-devel] Apparent displaced array type bug

David Steuber david at david-steuber.com
Fri Sep 23 09:01:53 UTC 2005


Hi OpenMCL developers,

Please see LispPaste:  http://paste.lisp.org/display/11910

david at interloper:~/usr/src/apress-fractal/src
$ openmcl
Welcome to OpenMCL Version 1.0-test-050914 (DarwinPPC32)!
? (load (compile-file "apress-fractal.lisp"))
Performing compile-time optimization.. please wait.
Done.
#P"/Users/david/usr/src/apress-fractal/src/apress-fractal.dfsl"
? (time (generate-fractals-from-input-file "../sampleinput.txt"))
 > Error in process listener(1): The value #<ARRAY 600x800 type  
(UNSIGNED-BYTE 8), displaced> can not be used to set the value of the  
slot DATA in #<MSET-MAP [-1.0 1.0 1.0 -1.0] 800x600 #x8405A0E>, because  
it is not of type (SIMPLE-ARRAY (MOD 129) (* *)).
 > While executing: CCL::%MAYBE-STD-SETF-SLOT-VALUE-USING-CLASS
 > Type :POP to abort.
Type :? for other options.
1 > :pop

? (quit)


This is code that works in both SBCL 0.9.4.0 and CLisp 2.33.2 on OS X  
10.3.9.  The relevant portion I think is this:

(defclass mset-map ()
   ((left           :type single-float       :initarg :left            
:reader mset-map-left)
    (right          :type single-float       :initarg :right           
:reader mset-map-right)
    (top            :type single-float       :initarg :top             
:reader mset-map-top)
    (bottom         :type single-float       :initarg :bottom          
:reader mset-map-bottom)
    (width          :type (integer 1 4096)   :initarg :width           
:reader mset-map-width)
    (height         :type (integer 1 4096)   :initarg :height          
:reader mset-map-height)
    (x-axis         :type simple-vector)
    (y-axis         :type simple-vector)
    (data           :type (simple-array (integer 0 #.+max-iterations+)  
(* *)))
    (data-alias     :type (simple-array (integer 0 #.+max-iterations+)  
*))))

(defmethod shared-initialize :after ((o mset-map) slot-names &rest  
init-args)
   (declare (ignore slot-names init-args))
   (flet ((make-axis-array (len min max)
            (let ((my-array (make-array len)))
              (loop for i below len
                 with pixelsize = (/ (- max min) len)
                 with start = min
                 do (setf (svref my-array i) (+ start (* i pixelsize))))
              my-array)))
     (with-slots (left right top bottom x-axis y-axis data data-alias  
height width) o
       (setf x-axis (make-axis-array width left right)
             y-axis (nreverse (make-axis-array height bottom top))
             data-alias (make-array (* height width)
                                    :element-type '(integer 0  
#.+max-iterations+)
                                    :initial-element 0)
             data (make-array (list height width)
                                :element-type '(integer 0  
#.+max-iterations+)
                                :displaced-to data-alias)))))

Just in case I am wrong, the complete code is here:

http://www.david-steuber.com/Lisp/Apress-Fractal-Contest/apress- 
fractal.lisp.txt




More information about the Openmcl-devel mailing list