Rafi писал(а):
Возник ступор с использованием процедуры RWFromFP...
Допустим, загрузил я bmp-файл, и хранится он у меня в какой-нибудь переменной bmpFile: Files.File.
Не могу сообразить, что мне передать в параметр fp: Sdl.Pointer. Попытался так: завёл указатель bmpBytes: POINTER TO ARRAY OF BYTE, прочитал в bmpBytes байты из bmpFiles. Затем записываю rw := Sdl.RWFromFP(x, 0). Компилятор говорит о несовместимости. Я так понимаю, что он не хочет совмещать указатель на массив с указателем на антаговый массив, коим является Sdl.Pointer. Но как в таком случае передать байты bmp-файла в RWFromFP?
Функция RWFromFP читает файл из файловой переменной, которая конечно несовместима ни с какими Files.File или POINTER TO ARRAY OF BYTE. Там, видите, есть коммент (* fp is FILE *fp ??? *) ? fp это указатель на файл в сишной нотации. Мне кажется, Вам вместо RWFromFP нужно воспользоваться для этой цели функциями RWFromMem или RWFromConstMem. Вот рабочий пример:
Код:
TYPE
Coords* = INTEGER;
Sprite* = Sdl.PSurface;
PROCEDURE PutScaledSprite* (x, y: Coords; spr: Sprite);
VAR
dest: Sdl.Rect;
img, scaled: Sdl.PSurface;
size: Sdl.Integer;
BEGIN
(* Use SDL_SoftStretch *)
SYSTEM.GET(SYSTEM.VAL(Sdl.Integer, spr) + 2 + ProcDisplacement, size);
img := Sdl.LoadBMPRW(SYSTEM.VAL(Sdl.PRWops,
Sdl.RWFromConstMem(SYSTEM.VAL(Sdl.Pointer, SYSTEM.VAL(Sdl.Integer, spr)
+ ProcDisplacement), size)), 1);
...
END PutScaledSprite;
Rafi писал(а):
Но вот опять споткнулся об антаговый тип.
Имеем процедуру Load(file: PChar), где PChar: POINTER TO ARRAY [untagged] OF CHAR.
Вызываем процедуру таким образом: Load("путь к файлу"). Процедура возвращает TRUE, файл успешно загружен.
Но вот я завожу переменную fileName: POINTER TO ARRAY OF CHAR. Загоняю в неё строку "путь к файлу".
Затем вызываю Load(SYSTEM.VAL(PChar, fileName)). Процедура возвращает FALSE. Происходит искажение строки? Или там вообще не строка в итоге передаётся?
В общем, гадаю, что за изменение произошло, отчего путь к файлу оказывается неверным.
Rafi, Вы, похоже, нормальную защиту типов КП воспринимаете как врага для Вашей работы.
Смотрите внимательнее: PChar вовсе не является POINTER TO ARRAY [untagged] OF CHAR.
Код:
TYPE
Char* = SHORTCHAR;
...
PChar* = POINTER [untagged] TO ARRAY [untagged] OF Char;
Вы просто приводите Вашу строку fileName типа CHAR к короткой однобайтовой строке PChar. Это банальная несовместимость типов. Попробуйте Load(SHORT(fileName$)). Без всякого SYSTEM.VAL.
Роман М. писал(а):
Так что нередко мало одной только обертки и, поэтому, достраивается дополнительный переносимый модуль для комфортной работы, часто с применением ООП.
Это правильно. Кстати, для SDL есть объектная обёртка
http://osdl.sourceforge.net/. Надо подтягивать в эту сторону и Обероны.