Saferoll писал(а):
Насколько я понял, SDCC до сих пор не понимает оператор присваивания для всей записи целиком (проблема
Feature cannot assign values to aggregates).
Да, пока не спешат исправить. У них там специализация. Филипп Краузе, с которым налажен контакт, по бэку Z80, во фронт-энд не лезет. А Эрик Петрич, или кто у них там по фронту, задвинул это дело в долгий ящик.
Я пока что делаю так:
Код: "OBERON"
TYPE
Rank* = SHORTINT; Suit* = SHORTINT;
Card* = RECORD suit*: Suit; rank*: Rank END;
Cards = ARRAY Amount OF Card;
VAR
desk*: ARRAY 12 OF Card;
hand*: ARRAY Players OF Cards;
Код: "OBERON"
IF Sets.AssignValsToAggregs THEN
desk[deskN] := hand[player, cardn];
ELSE
desk[deskN].suit := hand[player, cardn].suit;
desk[deskN].rank := hand[player, cardn].rank;
END;
Код получается оптимальный; Ofront вообще выкидывает неиспользуемую ветку.
Saferoll писал(а):
Но тут вылезла другая ошибка, связанная с охраной типов.
Код: "TEXT"
AsgnRec.c:37: error 101: too many parameters
AsgnRec.c:37: error 48: cannot assign values to aggregates
Ошибка 48 понятна, это как раз и есть проблема с присваиванием. А что такое "слишком много параметров"?
Это ошибка отсутствия реализации процедуры SYSTEM_HALT в ZXDev. Я собрал твой код (убрав импорт) в WinDev, всё скомпилиорвалось.
Saferoll писал(а):
SYSTEM_HALT, которая в этом же файле SYSTEM.H определена как процедура без параметров
Код: "C"
extern void SYSTEM_HALT();
Вот это несоответствие числа параметров, видимо и вызывает ошибку 101.
Всё не так просто. Это объявление в "старом стиле", где сначала объявляется процедура с пустыми скобочками, а потом дальше набор параметров. Ведь void внутри скобок нет. Не знаю есть ли смысл поддерживать этот старый стиль, я не встречал компиляторов, которые не понимают нового.
Saferoll писал(а):
Что же это за процедура SYSTEM_HALT и сколько у ней должно быть параметров?
Макрос __HALT, он же процедура SYSTEM_HALT имеет один параметр (код возврата) и превращается (должна превращаться) в сишный exit(n); для WinDev так и есть; а вот в ZXDev я так и не придумал как правильно выйти в бейсик (особенно с учётом режима прерываний и необходимого для этого вызова Basic.Quit).
Пока не реализована SYSTEM_HALT можно реализовать __GUARDEQR и __GUARDEQP (охрана типов) как "пустышки", просто игнорирующие проверку типа (и не вызывающие __HALT). Опция "игнорировать охрану типа" может быть добавлена в XDevCfg.h. Впрочем, в данном конкретном случае это мало что даст, потому что раздельное присваивание полей работает и так.
Код: "OBERON"
a^.suit := b^.suit;
a^.rank := b^.rank;