LINUX.ORG.RU

Типы данных в SBCL


0

1

The value 1232.0d0 is not of type (SIGNED-BYTE 32). [Condition of type TYPE-ERROR]

вот это мне пишет отладчик, я так понимаю тип числа не подходит для функции. Как привести это число к типу (Наверное SIGNED-BYTE 32) или просто не дробному. PCL не знает там написано что это не тема данной книги. По гуглу лазим но достаточно безуспешно, все говорят что типизация данных динамическая. Но я знаю что можно жестко задать тип переменной или число привести в определённый вид. Я не знаю как это сделать. Если что то не понятно пишите поясню, выложу код по возможности.

Я не смог понять смысл предложений во втором абзаце, честно :(

Ошибка такова, что где-то получается число 123.0 (типа double-float), а ожидается целое число от -2^32 до 2^32-1.

Перевести из вещественного числа в целое можно разными видами округления с помощью функций round, floor, truncate, ceiling.

Но, вероятно, у вас ошибка в коде где-то ранее, что приводит к тому, что получается вещественное число.

dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

Дмитрий я всё работаю с вашим проектом CL-GTK2+ я вычисляю ширину нужную мне и высоту нужную мне, и пытаюсь задать с помощью всё того же widget-width-request вот код

;числа задаю просто так
(defvar *Ширина* 4)
(defvar *Высота* 3)

;Вот кусок кода на котором всё считается и вываливается ошибка
(if (> *Колличество-картинок* 0)(loop for *и* from 1 upto *Колличество-картинок*
do(when (Gethash *и* Координата-х-картинки)(progn (scale *Масштаб* *Масштаб*)
(set-source-surface (Gethash *и* Картинко) (Gethash *и* Координата-х-картинки) (Gethash *и* Координата-у-картинки))
(if (= *Выбирается-подложка* 1)
(progn(if(< *Ширина* (+(Gethash *и* Координата-х-картинки)(image-surface-get-width(Gethash *и* Картинко)))) (setf *Ширина* (+(Gethash *и* Координата-х-картинки)(image-surface-get-width(Gethash *и* Картинко)))))
(if(< *Высота* (+(Gethash *и* Координата-у-картинки)(image-surface-get-width(Gethash *и* Картинко)))) (setf *Высота* (+(Gethash *и* Координата-у-картинки)(image-surface-get-width(Gethash *и* Картинко)))))
(setf (widget-width-request widget) *Высота*;вот тут валится
		 (widget-height-request widget) *Ширина*)))
(paint)))))
RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

Вот так всё решил, всё работает

 (if (> *Колличество-картинок* 0)(loop for *и* from 1 upto *Колличество-картинок*
do(when (Gethash *и* Координата-х-картинки)(progn (scale *Масштаб* *Масштаб*)
(set-source-surface (Gethash *и* Картинко) (Gethash *и* Координата-х-картинки) (Gethash *и* Координата-у-картинки))
(if (= *Выбирается-подложка* 1)
(progn(if(< *Ширина* (+(Gethash *и* Координата-х-картинки)(image-surface-get-width(Gethash *и* Картинко)))) (setf *Ширина* (+(Gethash *и* Координата-х-картинки)(image-surface-get-width(Gethash *и* Картинко)))))
(if(< *Высота* (+(Gethash *и* Координата-у-картинки)(image-surface-get-width(Gethash *и* Картинко)))) (setf *Высота* (+(Gethash *и* Координата-у-картинки)(image-surface-get-width(Gethash *и* Картинко)))))
(setf (widget-width-request widget) (ceiling *Высота*)
		 (widget-height-request widget) (ceiling *Ширина*))))
(paint)))))
RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

(loop for *и* from 1 upto *Колличество-картинок*

Исторически, озведачивание имён переменных применяют для переменных с глобальной видимостью. *и* является локальной переменной в loop, и поэтому звёзды по бокам режут глаз.

mv ★★★★★
()
Ответ на: комментарий от mv

Просто сделано это скорее для удобста я только начинаю писать на лиспе, и когда делал цикл то вылетало много ошибок, и если я её делал локальной переменной то я не мог проверить на каком шаге была ошибка а так я могу это очень легко определить. Просто я думал отладить и потом убрать... но забыл, да и смысла особенного кроме как «красивого синтаксиса» нет.

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

Э-э, зачем вы пишете (when ... (progn - можно просто (when ... (, т.е. progn там уже встроенный.

Также не нужно (if ... (progn - у вас же нет else варианта, используйте (when ...

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Без progn несколько подряд идущих функций, вываливаются в ошибку. Ну естественно если будет один setf просто без других функций то да но если что то ещё то нужно оборачивать в progn.

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

Без progn несколько подряд идущих функций, вываливаются в ошибку.

Что это значит? Я думаю, что вы невнимательно проверяли.

Вообще, как вы в этой мешанине хоть что-то понимаете?

В таком виде, мне кажется, код читается гораздо легче:

(loop
 for i from 1 to *колличество-картинок*
 do (when (gethash i координата-х-картинки)
      (scale *масштаб* *масштаб*)
      (set-source-surface (gethash i картинко) (gethash i координата-х-картинки) (gethash i координата-у-картинки))
      (when (= *выбирается-подложка* 1)
        (when (< *ширина* (+ (gethash i координата-х-картинки) (image-surface-get-width (gethash i картинко))))
          (setf *ширина* (+ (gethash i координата-х-картинки) (image-surface-get-width (gethash i картинко)))))
        (when (< *высота* (+ (gethash i координата-у-картинки) (image-surface-get-width (gethash i картинко))))
          (setf *высота* (+ (gethash i координата-у-картинки) (image-surface-get-width (gethash i картинко)))))
        (setf (widget-width-request widget) (ceiling *высота*)
              (widget-height-request widget) (ceiling *ширина*)))
      (paint)))

dmitry_vk ★★★
()
Ответ на: комментарий от RusNekromant

> Без progn несколько подряд идущих функций, вываливаются в ошибку

Сделайте нормальное выравнивание кода и посмотрите внимательно, вы видимо в скобках запутались.

Кроме того *колличество-картинок* - совершенно лишняя сущность. Просто перебирайте все ключи хэша с помощью loop.

И еще вопрос - зачем вы вообще используете хэш с числовым ключом - это просто массив получается. И нафига вам столько хэшей - сделайте структуру и пихайте все данные в один хэш - заодно и код упростится.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Со структурой просто не знаю как работать, хотя наверное так же проще как и с хэшом... И мне очень удобно работать с числовым ключём, он маленький, сквозной и очень удобный.... и сейчас всё завязано на хэше возможно попозже когда реализую то что хотел и сделаю бэта версию, и перейду к оптимизации, то попробую другие варианты.... Сейчас мне нужно сделать побыстрее, а самый короткий путь это тот который знаешь...

P.S. Кстати насчёт выборки по количеству записей хэша в loop я просто не знаю как это сделать, но с другой стороны это не нужно так как числовой индекс нужен будет всё равно что бы потом найти именну ту запись которая нужна

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

> насчёт выборки по количеству записей хэша в loop я просто не знаю как это сделать

(loop for ключ being the hash-keys in *хэш* do (...

так как числовой индекс нужен будет всё равно что бы потом найти именну ту запись которая нужна

У вас же одинаковые ключи - получаете очередной ключ/индекс первого хэша и по нему извлекаете данные из всех остальных.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Хм действительно, с этой стороны я не посмотрел...пасиба.

RusNekromant
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.