> 1 <

Автор Сообщение

semyon

Members


Статус

2 сообщений

Где: Russia
Род занятий:
Возраст:

#1284   2010-02-02 02:51 GMT+3 часа(ов)      
Подскажите, как создать массив структур?

Так не получается:

(defstruct cell x y vx vy)
(setf test (make-array '(100 100) :element-type 'cell))

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#1285   2010-02-02 23:56 GMT+3 часа(ов)      
(defstruct cell x y vx vy)

(setq z (make-cell))

#S( CELL :X NIL :Y NIL :VX NIL :VY NIL )

(make-array '(4 2) :initial-element z )


#2A((#S( CELL :X NIL :Y NIL :VX NIL :VY NIL ) #S( CELL :X NIL :Y NIL :VX NIL :VY NIL ))(#S( CELL :X NIL :
Y NIL :VX NIL :VY NIL ) #S( CELL :X NIL :Y NIL :VX NIL :VY NIL ))(#S( CELL :X NIL :Y NIL :VX NIL :VY NIL
) #S( CELL :X NIL :Y NIL :VX NIL :VY NIL ))(#S( CELL :X NIL :Y NIL :VX NIL :VY NIL ) #S( CELL :X NIL :Y N
IL :VX NIL :VY NIL )))
Это было точно последнее редактирование

semyon

Members


Статус

2 сообщений

Где: Russia
Род занятий:
Возраст:

#1289   2010-02-06 23:26 GMT+3 часа(ов)      
Спасибо, так создается. Но у меня один вопрос. Почему при попытке изменения значения в одном элементе этого массива меняются все элементы:

 
(defstruct cell x y vx vy)
(defvar z)
(setf z (make-cell))
(defvar test)
(setf test (make-array '(2 2) :initial-element z))
(setf (cell-vx (aref test 1 1)) 1.4)
 


после этого test такой:
#2A((#S(CELL :X NIL :Y NIL :VX 1.4 :VY NIL)
#S(CELL :X NIL :Y NIL :VX 1.4 :VY NIL))
(#S(CELL :X NIL :Y NIL :VX 1.4 :VY NIL)
#S(CELL :X NIL :Y NIL :VX 1.4 :VY NIL)))

Подскажите, что здесь я делаю не так?

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#1290   2010-02-07 00:15 GMT+3 часа(ов)      
semyon
Ну это же просто, Ватсон - одна и та же структура,т.е. каждый элемент массива указывает на одну и ту же структуру. Другиим словами, клонирования структур в данном случае нет. Не знаю, плохо это или хорошо.

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#1291   2010-02-07 00:31 GMT+3 часа(ов)      
semyon
Я бы сказал, что такая инициализация в случае структур бессмысленная. Придется Вам самим писать соответствующий цикл или макрос.

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#1292   2010-02-07 15:37 GMT+3 часа(ов)      
А вот интересно чего оно не реагирует на обычное решение?
"element-type"

(defstruct cell x y vx vy)
(setf test (make-array '(100 100) :element-type 'cell))



Какие тогда еще есть способы созадания нового типа данных?

P.S.
Наверное , структуры в лиспе не совсем структуры , а вектор он же array
вроде как последовательно(непрерывно) выделеная память.
Это было точно последнее редактирование

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 6

#1293   2010-02-07 16:47 GMT+3 часа(ов)      
Цитата
А вот интересно чего оно не реагирует на обычное решение?


Почему не реагирует? Создает кучу нилов, как и следует. Т.к. все(кроме понятно чего) в цл является указателями(pcl).

К bach'у добавить нечего.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#1300   2010-02-08 17:17 GMT+3 часа(ов)      
Цитата
gihar :
Какие тогда еще есть способы созадания нового типа данных?

P.S.
Наверное , структуры в лиспе не совсем структуры , а вектор он же array
вроде как последовательно(непрерывно) выделеная память.

В лиспе всего два типа данных: число и список, а остальные всего-лишь производные.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#1301   2010-02-08 18:15 GMT+3 часа(ов)      
Если у Схемера возникает необходимость получить точную копию объекта (а не ссылку), то он либо пишет собственную функцию копирования, либо использует библиотечную.
Например, функция для создания новой копии объекта, содержащего только встроенные типы данных
(define (get-copy obj)
(letrec ((new-pair
(lambda (l)
(if (pair? l)
(cons (get-copy (car l))
(new-pair (cdr l)))
l))))
(cond
((pair? obj)
(new-pair obj))
((vector? obj)
(list->vector (new-pair (vector->list obj))))
((string? obj)
(string-copy obj))
(else
obj))))
> 1 <


Онлайн :

0 пользователь(ей), 37 гость(ей) :




Реклама на сайте: