Refal6 для Linux скомпилирован


Subject: Refal6 для Linux скомпилирован
dmsidorov@mtu-net.ru
Date: Mon Nov 05 2001 - 12:00:59 MSK


Здравствуйте, Аркадий.

On Sat, Nov 03, 2001 at 02:04:35PM +0300, Arkady Klimov wrote:
> | Мне очень не нравится в этом (и других) макросах использование типа
> | long, длинна которого зависит от реализации.
>
> Разве? В то время (начало 90х) я тоже этим интересовался и выяснил для себя
> (может, я ошибался?), что размеры short и long всегда, соответственно, 16 и 32,
> а вот размер int зависит от реализации - либо 16, либо 32. С другой стороны, я
> не стремился в реализации рефала фиксировать все размеры: если происходит
> перенос на систему, где разрядность адреса больше, то соответственно
> должны увеличиваться разрядности полей под некоторые значения (например,
> под индексы массивов). Таким образом, кое-где в системе использован тип int,
> который в разных реализациях имеет свою разрядность: 16 или 32, и так оно
> в общем-то и задумано. Но, возможно, Вы правы, и надо было всегда использовать
> макросы (или определяемые типы).

Сейчас пытаюсь вспомнить, где читал рекомендации по переносимости, и
в том числе по рекомендуемым и нерекомендуемым типам, и не могу найти,
возможно, даже чего-то спутал. Когда найду, напишу конкретнее. С
определяемыми типами, мне кажется, можно будет чувствовать себя
увереннее, чем с макросами. Но я не считаю, что ошибка из-за
несовпадения типов, вот когда кто-нибудь попробует перенести на другую
аппаратуру, тогда да.

> | Еще один вопрос, насчет функций с пустым списком параметров. Они
> | точно считаются фукциями без параметров? gcc по-умолчанию считает
> | именно так, но в ANSI C их вроде полагается считать имеющими
> | произвольное число параметров?
> Никогда об этом ничего не слышал. Насколько я помню, произвольное число
> параметров указывается всегда особо, вроде как многоточием в конце списка
> параметров, но я никогда этим не пользовался.

Да, произвольеое число параметров указывается именно так, но в стандарте C
осталось умолчание Кернигана и Ритчи насчет пустых скобок. Это хорошо, что
в Рефале они считаются не имеющими аргументов.

> Возвращаюсь к макросу. Мне кажется странным, что становится нормально, только
> когда убирается операция &. Вроде это нормальная логическая операция для двух long
> операндов? (Замечу, что здесь использовано long, а не float, именно ради этой операции.)
> А будет ли компилироваться, если предварительно эту константу вычислить в
> переменную типа long?

Нашел еще несколько вариантов, как убрать сообщение об ошибке, в том
числе просто убрав остальные два условных оператора (именно два), это
несомненно ошибка компилятора. Может, кто-нибудь знающий английский
лучше меня, поможет составить сообщение об ошибке?

Правильно ли я понимаю, что этот макрос подставляет четырехбайтовую
переменную с тремя младшими байтами равными 0x6, в ячейку памяти,
определяемую как float, и обнуляет младшие три бита? Но что же там
находится, в этих битах у типа float? За них можно быть спокойным
на другой ОС с другим компилятором?

Во всяком случае, если переделать макрос в подставляемую функцию,

inline void cvalue2float_fun (cvalue cc, float f)
{ cvalue2float(cc,f);
   };

протесты компилятора прекращаются. Так, наверно, и надежнее, поскольку
у макросов контроля нет.

ri скомпилирован, правда, компоновщик выдал предупреждение:

rbeval.o: In function `rf_eval':
/home/dima/archive/refal/c1/rbeval.c:218: the `gets' function is dangerous and should not be used.

При первом запуске ri было выдано предупреждение

EVAL: *** Unexpected FAIL

дальше нормальное приглашение коммандной строки.

Теперь, когда Рефал скомпилирован, прошу советов, с чего лучше начать его
изучение, и как тестировать. Полный список исправлений для компиляции под
Linux пришлю позднее, когда все проверю.

Дмитрий



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:59 MSD