Помощь - Поиск - Пользователи - Календарь
Полная версия: UNIT expected
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Mr. Anderson
Установлена операционная система Windows XP PRO.
При проверке программы на Borland Pascal 7.0 выдаёт ошибку UNIT expected. Курсор мигает в начале программы. Программа взята с
Построение любого графика
Думаю, это как то связано с Graph. программы с использованием Crt работают нормально.
 
program grafik;
{$N+}
{$E+}
Uses Graph,crt;
const
{ OPTIONS }
shag=0.0001;
lgr = -50;
pgr = 50;
zcrtX=320;
zcrty=240;
mtrX=10;
mtrY=10;
colorG=15;
colorOXY=4;
OXYminX=-200;
OXYmaxX=200;
OXYminY=-200;
oxymaxY=200;
Var grDriver : Integer;
grMode : Integer;
x,y:real;{extended;}
i:integer;
Begin
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
for i:=OXYminX to OXYmaxX do putpixel(zcrtX+i,zcrty,colorOXY);
for i:=OXYminY to OXYmaxY do putpixel(zcrtX,zcrty-i,colorOXY);
x:=lgr;
while x<=pgr do
begin
{ readln(x);}
{***} if x<>2 then begin y:=abs(x/(x-2))-1; {***}
{ writeln(y:1:8);}
putpixel(zcrtx+trunc(x*mtrX),zcrty-trunc(y*mtrY),colorg) end;
x:=x+shag;
end;
readkey;
closegraph;
end.



Помогите исправить ошибку.
volvo
Во-первых, почему здесь? Есть же раздел "Задачи"? А во-вторых, твоя программа у меня компилируется и под BP7 и под TP7 совершенно нормально - что-то у тебя с настройками среды програмирования...

Переезжаем в Задачи...
volvo
Стоп... Вопрос на засыпку: Как называется файл, в котором находится эта программа?
Mr. Anderson
файл называется grafik.pas . Находится C:\BP\BIN
Сначала скопировал на BPW, сохранил как graf. Потом открыл в BP. добавил в начале program grafik;
Нажал run >> UNIT expected. Курсор мигает в начале.
Потом напечатал в вручную в BP
File >> Change directory >> C:\BP\BIN
Может здесь нужно что-то поменять?
Я знаю, что программа правильна, всё дело в настройках...

volvo
Mr. Anderson, ты опять даешь противоречивую информацию... Тебя спросили, как файл называется, ты начинаешь юлить:
Цитата
файл называется grafik.pas
, однако:
Цитата
Сначала скопировал на BPW, сохранил как graf
Так вот учти, если выяснится, что ты сохранил НЕ как graf, а как GRAPH (чувствуешь разницу, да?) то тебе никто не поможет решить твою проблему, ибо ты в программе делаешь Uses Graph, следовательно, опять же начинает компилироваться ТВОЙ ЖЕ файл, и что? Первое слово, которое компилятор ждет в нем - Unit, у тебя его нет... Ошибка...

Переименуй файл в 1.pas и попробуй скомпилировать !!!
Mr. Anderson
Да, выяснилось blink.gif ... сохранил как graph.pas свою программу (c другой функцией, другим диапазоном...) до того, как проверял программу из форума...
Удалил этот файл (graph.pas), т.к. по-прежнему выдавало ошибку в программе ( уже 1.PAS) . Теперь новая ошибка. Error 15: File not found (GRAPH.TPU). Курсор мигает на ; в строке Uses Graph, crt;
Этот файл GRAPH.TPU, однако, сейчас после удаления graph.pas , находится по-прежнему в C:\BP\UNITS (он не удалён).
dry.gif Кажется, прийдётся переустанавливать Паскаль... ??? Хотя вряд ли поможет...
compiler
по моему эта программа для FP...
Mr. Anderson
Пока мы сейчас проходим Паскаль 7.0 ( с сентября прошлого года)
volvo
Один ответ на 2 предыдущих поста: "Ничего подобного"...

Для compiler: эта программа - для любого компилятора Паскаля, в том числе и для FP...
Для Mr. Anderson: Файл GRAPH.TPU должен присутствововать в текущей папке, или в одной из папок, перечисленных в Options -> Directories -> Unit Directories ...
compiler
Цитата(volvo @ 8.03.2007 14:38) *

Для compiler: эта программа - для любого компилятора Паскаля, в том числе и для FP...

да тут я ошибся... у меня и на FP компилируется и на TP...
Mr. Anderson
good.gif Спасибо. Осталось ещё немного:
После исправлений в unit directories (вместо D:\BP\UNITS C:\BP\UNITS, у меня тот же Паскаль установлен и на диске D) нажимаю на >> Run, экран очень быстро показывает чёрный экран (даже не видно график) и мгновенно закрывается, пробовал в конце перед end. поставить readln; ничего не изменилось...
volvo
ReadLn надо ставить НЕ перед End. , а перед CloseGraph... Это во-первых... А во-вторых: уверен, что граф. режим успешно инициализировался? Я бы все-таки это проверял:

...
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
ErrCode := GraphResult;
if ErrCode <> grOk then begin
Writeln('Ошибка: ', GraphErrorMsg(ErrCode)); Readln; Halt(100);
end;
...
Файл EGAVGA.BGI в текущей папке присутствует?
compiler
Цитата(compiler @ 8.03.2007 14:43) *

да тут я ошибся...

дело в том что у меня вместо
grDriver, grMode: integer;
стоит строчка
grDriver, grMode: smallint;

какая разница или что такое smallint?
Mr. Anderson
EVANGA.BGI присутствует ( C:\BP\BGI ).

Сначала ставил просто перед closegraph;
Скомпилировал >> тот же быстро исчезающий чёрный экран.
Потом ставил

ErrCode:=GraphResult;
if ErrCode <> grOk then begin
writeln('Oshibka: ', GraphErrorMsg(ErrCode));
readln;
halt(100);
end;

как показано ниже. { Error 3: Unknown identifier. {курсор на ErrorCode
ErrCode :=GraphResult; } }


program grafika;
{$N+}
{$E+}
Uses Graph,crt;
const
{ OPTIONS }
shag=0.0001;
lgr=-50;
pgr=50;
zcrtX=320;
zcrtY=240;
mtrX=10;
mtrY=10;
colorG=15;
colorOXY=4;
OXYminX=-200;
OXYmaxX=200;
OXYminY=-200;
OXYmaxY=200;

Var grDriver:integer;
grMode:integer;

x,y:real;{extended;}
i:integer;
Begin
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
ErrCode:=GraphResult;
if ErrCode <> grOk then begin
writeln('Oshibka: ', GraphErrorMsg(ErrCode));
readln;
halt(100);
end;
for i:=OXYminX to OXYmaxX do putpixel(zcrtX+i,zcrtY,colorOXY);
for i:=OXYminY to OXYmaxY do putpixel(zcrtX,zcrtY-i,colorOXY);
x:=lgr;
while x<=pgr do
begin
{ readln(x);}
{***} if x<>2 then begin y:=abs(x/(x-2))-1; {***}
{ writeln(y:1:8);}
putpixel(zcrtX+trunc(x*mtrX),zcrtY-trunc(y*mtrY),colorg) end;
x:=x+shag;
end;
readkey;
readln;
closegraph;
end.
volvo
Добавить:

Var
grDriver : Integer;
grMode : Integer;
ErrCode: Integer; { <--- Вот это ... }
Mr. Anderson
BGI Error: Graphics not initialized (use InitGraph)
....................................................................... (повторяется 44-45 раз )
Oshibka: Device driver file not found (EGAVGA.BGI)


Проверил, EGAVGA.BGI на месте в C:\BP\BGI
Unit directories C:\BP\UNITS;
Resource directories C:\BP\UNITS;
Change Directory C:\BP\BIN
GRAPH.TPU в C:\BP\UNITS

Также исправил, где надо, строчные буквы на заглавные для соответствия (oxy >> OXY, y>>Y , кроме, конечно переменных x, y.
volvo
Цитата
Проверил, EGAVGA.BGI на месте в C:\BP\BGI
Неправильный вывод... ЭТОТ файл должен быть рядом с EXE, в текущей папке !

Добавлено через 2 мин.
Цитата
Также исправил, где надо, строчные буквы на заглавные для соответствия
А вот это совсем лишнее... для Паскаля нет разницы, это NON-case-sensitive язык
Mr. Anderson
теперь файл EGAVGA.BGI в папке BIN.
компилируется smile.gif
Только оси без стрелок и обозначений (x, y, 0). unsure.gif
Вопрос:
нужно ли остальные файлы BGI скопировать в BIN (так, если будут другие программы на графику)?
volvo
Цитата
нужно ли остальные файлы BGI скопировать в BIN
Вообще-то я бы крайне не рекомендовал сбрасывать все свои программы в папку \BIN... Это все-таки папка для средства разработки... Создал бы свою папку для программ, и работал бы с ней...

Это первое... Второе - зачем тебе другие BGI? Ты что, собрался делать программу, которая будет работать с любыми драйверами? Сомневаюсь...

Ну, и третье: лучше всего (если ты уже занялся разработкой графических программ), написать вот такой модуль:
Unit BGI;

interface

Procedure EgaVgaDriverProc;
{ Сюда можешь добавить также другие драйверы }

Procedure SmallFontProc;
{ Можно добавить любые другие шрифты }

implementation

{$L EGAVGA.obj}
Procedure EgaVgaDriverProc; External;
{ Не забудь добавить все OBJ файлы и описания внешних процедур сюда }


{$L LITT.obj}
Procedure SmallFontProc; External;
{ Не забудь добавить все OBJ файлы и описания внешних процедур сюда }

begin
If RegisterBGIDriver(@EgaVgaDriverProc) < 0 then Halt(100);
{ Здесь надо зарегистрировать ВСЕ описанные выше драйверы }

If RegisterBGIFont(@smallFontProc) < 0 then Halt(200);
{ Здесь надо зарегистрировать ВСЕ описанные выше шрифты }
end.

, откомпилировать его один раз, а потом просто использовать в программе, не заботясь о присутствии BGI и CHR файлов в текущей папке...

(о том, как преобразовать BGI/CHR в OBJ - читай здесь: Директивы компилятора - про директиву $L )
Mr. Anderson
Спасибо, попробую. А как поставить стрелки и обозначения? я не нашёл по поиску.
volvo
А как поставить стрелки и обозначения?
for i:=OXYminX to OXYmaxX do putpixel(zcrtX+i,zcrtY,colorOXY);
for i:=OXYminY to OXYmaxY do putpixel(zcrtX,zcrtY-i,colorOXY);

заменить на:

setcolor(colorOXY);
line(zcrtX+OXYminX, zcrtY, zcrtX+OXYmaxX, zcrtY); { horz }
moveto(zcrtX+OXYmaxX-7, zcrtY-2);
lineto(zcrtX+OXYmaxX, zcrtY);
lineto(zcrtX+OXYmaxX-7, zcrtY+2);

line(zcrtX, zcrtY-OXYminY, zcrtX, zcrtY-OXYmaxY); { vert }
moveto(zcrtX - 2, zcrtY-OXYmaxY+7);
lineto(zcrtX, zcrtY-OXYmaxY);
lineto(zcrtX + 2, zcrtY-OXYmaxY+7);

settextjustify(centertext, centertext);
outtextxy(zcrtX, zcrtY-OXYmaxY-(textheight('Y') div 2) - 3, 'Y');
outtextxy(zcrtX+OXYmaxX+(textwidth('X') div 2) + 3, zcrtY, 'X');
Устроит?
Mr. Anderson
volvo, огромное спасибо good.gif Всё получилось


compiler
так какая разница между smallint и integer (ссылку дайте хотя бы).
volvo
Да нет никакой разницы, просто smallint гарантированно имеет размер в 2 байта (см. файл Ref.PDF из документации на FPC) в отличие от Integer, который может быть 2-х, 4-х или 8-ми байтовым, а процедура InitGraph принимает переменные по ссылке - значит, размер переменных должен совпадать с эталонным. Это гарантируется только использованием типа smallint...
compiler
Цитата(volvo @ 8.03.2007 22:28) *

Да нет никакой разницы...

благодарю..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.