Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ UNIT expected

Автор: Mr. Anderson 6.03.2007 3:18

Установлена операционная система Windows XP PRO.
При проверке программы на Borland Pascal 7.0 выдаёт ошибку UNIT expected. Курсор мигает в начале программы. Программа взята с
http://forum.pascal.net.ru/index.php?showtopic=2729&st=0&p=23770&#entry23770
Думаю, это как то связано с 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 6.03.2007 3:27

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

Переезжаем в Задачи...

Автор: volvo 6.03.2007 4:01

Стоп... Вопрос на засыпку: Как называется файл, в котором находится эта программа?

Автор: Mr. Anderson 8.03.2007 16:17

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


Автор: volvo 8.03.2007 16:57

Mr. Anderson, ты опять даешь противоречивую информацию... Тебя спросили, как файл называется, ты начинаешь юлить:

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

Переименуй файл в 1.pas и попробуй скомпилировать !!!

Автор: Mr. Anderson 8.03.2007 19:04

Да, выяснилось 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 8.03.2007 19:33

по моему эта программа для FP...

Автор: Mr. Anderson 8.03.2007 19:36

Пока мы сейчас проходим Паскаль 7.0 ( с сентября прошлого года)

Автор: volvo 8.03.2007 19:38

Один ответ на 2 предыдущих поста: "Ничего подобного"...

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

Автор: compiler 8.03.2007 19:43

Цитата(volvo @ 8.03.2007 14:38) *

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

да тут я ошибся... у меня и на FP компилируется и на TP...

Автор: Mr. Anderson 8.03.2007 20:11

good.gif Спасибо. Осталось ещё немного:
После исправлений в unit directories (вместо D:\BP\UNITS C:\BP\UNITS, у меня тот же Паскаль установлен и на диске D) нажимаю на >> Run, экран очень быстро показывает чёрный экран (даже не видно график) и мгновенно закрывается, пробовал в конце перед end. поставить readln; ничего не изменилось...

Автор: volvo 8.03.2007 20:18

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 8.03.2007 20:54

Цитата(compiler @ 8.03.2007 14:43) *

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

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

какая разница или что такое smallint?

Автор: Mr. Anderson 8.03.2007 21:22

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 8.03.2007 21:42

Добавить:


Var
grDriver : Integer;
grMode : Integer;
ErrCode: Integer; { <--- Вот это ... }

Автор: Mr. Anderson 8.03.2007 22:29

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.


Прикрепленные файлы
Прикрепленный файл  1.PAS ( 891 байт ) Кол-во скачиваний: 372

Автор: volvo 8.03.2007 22:47

Цитата
Проверил, EGAVGA.BGI на месте в C:\BP\BGI
Неправильный вывод... ЭТОТ файл должен быть рядом с EXE, в текущей папке !

Добавлено через 2 мин.
Цитата
Также исправил, где надо, строчные буквы на заглавные для соответствия
А вот это совсем лишнее... для Паскаля нет разницы, это NON-case-sensitive язык

Автор: Mr. Anderson 8.03.2007 23:17

теперь файл EGAVGA.BGI в папке BIN.
компилируется smile.gif
Только оси без стрелок и обозначений (x, y, 0). unsure.gif
Вопрос:
нужно ли остальные файлы BGI скопировать в BIN (так, если будут другие программы на графику)?

Автор: volvo 8.03.2007 23:51

Цитата
нужно ли остальные файлы 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 - читай здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=3895&view=findpost&p=34541 - про директиву $L )

Автор: Mr. Anderson 8.03.2007 23:58

Спасибо, попробую. А как поставить стрелки и обозначения? я не нашёл по поиску.

Автор: volvo 9.03.2007 1:07

А как поставить стрелки и обозначения?

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 9.03.2007 1:33

volvo, огромное спасибо good.gif Всё получилось





Прикрепленные файлы
Прикрепленный файл  2.pas ( 1.26 килобайт ) Кол-во скачиваний: 294

Автор: compiler 9.03.2007 3:16

так какая разница между smallint и integer (ссылку дайте хотя бы).

Автор: volvo 9.03.2007 3:28

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

Автор: compiler 9.03.2007 16:04

Цитата(volvo @ 8.03.2007 22:28) *

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

благодарю..