LINUX.ORG.RU
ФорумTalks

Тряхнуть стариной fpc, или когда ну хоть что-нибудь будет работать без напильника ?

 


0

2

Решил попробовать вспомнить юность, наваять коишо на паскакале. Если вкратце, то нужен простой понятный язык, позволяющий гонять пиксели по экрану, без всяких холстов, слоев, фреймворков, выделений памяти и прочих дрочерств: тупо drawpixel(x,y,опционально цвет). Паскакаль вроде подходит.

Ну тривиальная же задача: pacman -S fpc и программа которую поймет даже школьник

Uses ptcGraph;
var Driver: SmallInt; 
Mode  : SmallInt;
Begin
DetectGraph(Driver, Mode);
InitGraph(Driver, Mode, '');
SetColor(15);
Line(0, 0, 1024, 768);
ReadLn;
CloseGraph;
End.

Сперва IDE (fpc) ругнулось на отсутствие модуля ptcGraph. Сцука, ну ты же поставился. Оказывается надо прописать пути к юнитам (библиотекам) в конфиге. Прописал. Еще какой-то юнит (используемый ptcGraph) не найден. Окей, прописал и его. После пятого юнита нашел, что оказывается можно пути к юнитам прописать в корневой каталог юнитов, только вместо каждого юнита указать звезду *

Потом какие-то ошибки линковки. Включил дебаг IDE. Ворнинги указали что не найдены файлы crtbegin.o и crtend.o. Их я нашел в каталоге с gcc. Но эти пути нихрена не работают ни в одном параметре IDE.

Ну какого черта бы не сделать по-человечески ? Или я слишком много требую от Free ?

★★★★★

Ответ на: комментарий от abcq

взял и не справился даже с паскалем, ну… бывает, с наступающим :3

С FreePascal’ем.

windows10 ★★★★★
() автор топика

Это надо писать в багзиллу Arch'а, а не на ЛОР. У меня всё работает с конфигом из коробки.

> fpc test.pas
Компилятор Free Pascal версии 3.2.2 [2021/06/16] для x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Целевая ОС: Linux for x86-64
Компиляция test.pas
Компоновка test
11 строк скомпилиpовано, 1.0 сек.
> cat test.pas
Uses ptcGraph;
var Driver: SmallInt; 
Mode  : SmallInt;
Begin
DetectGraph(Driver, Mode);
InitGraph(Driver, Mode, '');
SetColor(15);
Line(0, 0, 1024, 768);
ReadLn;
CloseGraph;
End.
>

saahriktu ★★★★★
()

Я нихрена не знаю, что такое ptcGraph, но твой код устарел лет на 30. Перепиши сначала на Borland Pascal 7.0, уже потом пытайся портировать на fpc.

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

Та уже методом проб и ошибок разобрался. Забыл обновить libastral =) Просто привык что выдают сообщения об ошибках.

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

На borland pascal будут только два отличия: ptcgraph -> graph, smallint -> integer

firkax ★★★★★
()

У тебя код кривой. Где структурные отступы?

Проблем с модулями не было, хотя у меня fpc на Slackware собранный устаревшим slackbuild-ом.

После запуска — какой-то рантайм еррор на тему cthreads. После добавления этого юнита, ворнинг про crtbegin и end, но программа компилируется и запускается, просто ничего кроме чёрного экрана не показывает.

Но код у тебя всё равно кривой и некорректный.

Xenius ★★★★★
()

Вы, видимо, забыли дрочерство с egavga.bgi. И да, в ДОСовском ТР всё тоже начиналось с прописывания путей в настройках.

Вообще, проще всего было через прерывания BIOS установить режим 320х200 256 цветов, и шарашить напрямую в видеопамять.

tiinn ★★★★★
()
Последнее исправление: tiinn (всего исправлений: 2)

Не проще в браузере запустить DOS и там установить нормальный борман паскаль?

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

Я нихрена не знаю, что такое ptcGraph, но твой код устарел лет на 30.

Ну как бы да. Он использует модули, добавленные для совместимости, чтобы программы из старого BP для DOS можно было минимальными усилиями скомпилировать и запустить. Для создания чего-то нового такое не рекомендуется использовать.

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

Uses ptcGraph;

Понятно, используем библиотеку

var Driver: SmallInt;

Объявляем переменную Driver, ладно

Mode : SmallInt;

Это вот что?

DetectGraph(Driver, Mode);

Это вот что? Какой граф мы детектим?

InitGraph(Driver, Mode, '');

Инициализация, понятно

SetColor(15);

Вот это вот что? Какой к чертям цвет мы выбираем? В HEX/RGB? Или какая-то своя система цветов?

Line(0, 0, 1024, 768);

Построить линию, хорошо. Только вот что числа значат? От (0;0) до (1024;768)?

Parthen
()
<canvas id="screen" width="1024" height="768"></canvas>
<script>
function draw() {
    let ctx = document.getElementById('screen').getContext('2d');
    ctx.strokeStyle = "#f0f";
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(1024, 768);
    ctx.stroke();
}
document.addEventListener('DOMContentLoaded',
        () => requestAnimationFrame(draw));
</script>
PolarFox ★★★★★
()

Это уже давно не работает. Если нужен Graph, то ставь freedos с виртуалку. Там будет работать.

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

Вот это вот что? Какой к чертям цвет мы выбираем? В HEX/RGB? Или какая-то своя система цветов?

Это vga палитра на 256 цветов. Цвет выбирается по номеру. Вот так она мапится в rgb: https://github.com/resetius/lsystem/blob/master/colormap_vga1.h

Reset ★★★★★
()

Авторитетно советую:

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

Правда есть момент, при запуске графической программы на базе ptcGraph лазарус будет выбрасывать исключение. Просто кликаешь «продолжить выполнение» и дальше всё будет ОК.

И ешё, в FPC не надо писать DetectGraph, хватит Initgraph. Дело тут в том, что FPC имеет BGI-совместимую графическую библиотеку. Но она не копия, а просто совместимая по API. Поэтому некоторые сервисные функции оригинальной BGI Graph отсутсвуют. Правда шрифты BGI поддерживаются нормально.

В последнем Lazarus идёт FPC с современной библиотекой ptcGraph которая из коробки поддерживает режимы с глубиной цвета HiColor 15 bit, HiColor 16 bit, True Color (24 bit или 32 точно не помню). Ну и разрешения поддерживает современные. По крайней мере 800x600 и 1024x768 точно есть.

Что касается констант для установки видеорежима - то поищи в интернете статью про использованию ptcGraph в Linux. Там автор статьи приводит исходник программы, которая перечесляет доступные Drivers и Modes. Или зайди в модуль ptcGraph и посмотри коды режимов там.

pup_kin
()
Последнее исправление: pup_kin (всего исправлений: 11)
Ответ на: комментарий от Parthen

Это вот что?

Объявляем переменную Mode. В паскале объявления идут блоками — после var всё, что идёт до следующего блока, считается объявлениями переменных.

Это вот что? Какой граф мы детектим?

InitGraph следующей строчкой требует указания конкретного драйвера и режима. Это можно делать вручную, присваиванием значений переменным Driver и Mode, а можно использовать функцию автоопределения, которая сама попытается заполнить эти переменными подходящими значениями — DetectGraph.

Вот это вот что? Какой к чертям цвет мы выбираем?

15-й. Конкретно — зависит от выбранного драйвера и режима. Для 16-цветных режимов EGA/VGA это будет белый цвет, как и для 256-цветного режима VGA, для монохромных режимов и 4-цветных режимов CGA это будет либо ошибка, либо последний цвет палитры, в зависимости от реализации библиотеки (а фон по умолчанию чёрный).

Только вот что числа значат?

x,y начала, x,y конца.

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

Это vga палитра на 256 цветов.

Нет, это B8G8R8 в little-endian. А ты врёшь и не краснеешь.

i-rinat ★★★★★
()

DetectGraph(Driver, Mode);

На дворе конец 2021 года…

X512 ★★★★★
()
Ответ на: комментарий от i-rinat

Моя информация устарела. так работает.

Uses cthreads,ptcGraph;
var Driver: SmallInt; 
var r,g,b: Integer;
Mode  : SmallInt;
Begin
Mode := 0;
DetectGraph(Driver, Mode);
InitGraph(Driver, Mode, '');
r := 240;
g := 100;
b := 0;
SetColor((r shl 16) or (g shl 8) or b);
Line(0, 0, 1024, 768);
ReadLn;
CloseGraph;
End.
Reset ★★★★★
()
Ответ на: комментарий от windows10

В оп-посте про иксы ничего написано не было. А так в иксах есть браузер, а в браузере есть DOM, скорее всего даже с поддержкой канваса, если ты сюда не через dillo пишешь.

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

Т.е. две строчки на получение контекста тебя смущают, а DetectGraph, InitGraph и CloseGraph, которые в изначальном варианте вообще доступ к VGA-видеопамяти предполагают, а сейчас работают через три слоя абстракций — нет?

PolarFox ★★★★★
()

В принципе после дроча с путями все заработало. Относительно.

fpc - компилит нормально. А вот fp (IDE) компилит как-то по идиотски, после него:

[root@ntfs-a320mh ntfs]# ./test
bash: ./test: Permission denied
[root@ntfs-a320mh ntfs]#

Некритично, но абыдна =) Придется ставить лазарус.

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

Т.е. две строчки на получение контекста тебя смущают, а DetectGraph, InitGraph и CloseGraph, которые в изначальном варианте вообще доступ к VGA-видеопамяти предполагают, а сейчас работают через три слоя абстракций — нет?

Да не хочу я таскать за собой БРАУЗЕР.

Слинкованный пацкалем бинарь занимает 1.4 Мб.

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

Браузер не нужно за собой таскать, он есть на любом устройстве у всех пользователей. Прямо как BASIC на домашних компьютерах в 80-е.

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

Слинкованный пацкалем бинарь занимает 1.4 Мб.

Как-то много. Оригинальная программа вообще почти на голом железе работала, а тут тулкит, X11, libc, ядро с кучей модулей.

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

Браузер не нужно за собой таскать, он есть на любом устройстве у всех пользователей.

Давай не словоблудить, ок ?

Браузер для запуска этой штуки нужен ? Нужен. Если так - то он должен быть в системе. Мне это не подходит. Тчк.

windows10 ★★★★★
() автор топика
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от X512

Как-то много. Оригинальная программа вообще почти на голом железе работала, а тут тулкит, X11, libc, ядро с кучей модулей.

Ну это ж паскаль, что ты хотел ) Может какими-то флагами и можно уменьшить размер кода, но то такое )

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

Это можно делать вручную, присваиванием значений переменным Driver и Mode, а можно использовать функцию автоопределения, которая сама попытается заполнить эти переменными подходящими значениями — DetectGraph.

Я очень занят. Можно сразу использовать функцию чтобы она заполнила репу с проектом подходящим текстом?

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

Это GNUтый неправильный Паскаль. Оригинальный Паскаль не такой жирный.

На Windows 71килобайт программа из темы занимает.

fpc -O4 -g- main.pas

https://imgur.com/a/aRMqlZ2

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)

windows10: Сына, сейчас тебя папа научит программировать на турбо паскале.

Сын: <facepalm.jpg>

rupert ★★★★★
()

У тебя чёт не так. У меня с fpc таких проблем не было.

vasya_pupkin ★★★★★
()

я бы взял lua + SDL, готовые решения есть

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