giant@lindy.Stanford.EDU (Buc Richards) (10/18/89)
When I make an array of structures, any changes to any of the elements change all the elements. What am I dong wrong? Here is a simple case I ran on a NeXT and a MacII under Allegro Common Lisp with the same results. <cl> (defstruct cardtype card code) CARDTYPE <cl> (Setf tc (Make-array 25 :Element-type 'cardtype :Initial-element (make-cardtype))) #(#s(CARDTYPE :CARD NIL :CODE NIL) #s(CARDTYPE :CARD NIL :CODE NIL) #s(CARDTYPE :CARD NIL :CODE NIL) #s(CARDTYPE :CARD NIL :CODE NIL) #s(CARDTYPE :CARD NIL :CO DE NIL) #s(CARDTYPE :CARD NIL :CODE NIL) #s(CARDTYPE :CARD NIL :CODE NIL) #s(CA RD TYPE :CARD NIL :CODE NIL) #s(CARDTYPE :CARD NIL :CODE NIL) #s(CARDTYPE :CARD NIL :CODE NIL) ...) <cl> (Setf (cardtype-code (Aref tc 1)) 360) 360 <cl> tc #(#s(CARDTYPE :CARD NIL :CODE 360) #s(CARDTYPE :CARD NIL :CODE 360) #s(CARDTYPE :CARD NIL :CODE 360) #s(CARDTYPE :CARD NIL :CODE 360) #s(CARDTYPE :CARD NIL :CO DE 360) #s(CARDTYPE :CARD NIL :CODE 360) #s(CARDTYPE :CARD NIL :CODE 360) #s(CA RD TYPE :CARD NIL :CODE 360) #s(CARDTYPE :CARD NIL :CODE 360) #s(CARDTYPE :CARD NIL :CODE 360) ...) ---------------- Every element has the :code changed to 360. Thanks for any assistance. Rob Richards @ @ Stanford University -
mesard@bbn.com (Wayne Mesard) (10/20/89)
giant@lindy.Stanford.EDU (Buc Richards) writes: >When I make an array of structures, any changes to any of the elements >change all the elements. What am I dong wrong? [...] ><cl> (Setf tc (Make-array 25 :Element-type 'cardtype > :Initial-element (make-cardtype))) MAKE-CARDTYPE gets called once and only once. Every element in the array then contains a pointer to the ONE structure which was created. Changing one changes them all because they are one and the same. :INITIAL-ELEMENT probably isn't what you want. Try :INITIAL-CONTENTS. E.g.: (Setf tc (Make-array 25 :Element-type 'cardtype :Initial-contents (do ((i 25 (1- i)) (lis nil (cons (make-cardtype) lis))) ((zerop i) lis)))) Disclaimer: The DO may or may not be the politically correct way to cons up the list. Wayne();