> -- 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/. Надо подтягивать в эту сторону и Обероны.