Установлена операционная система 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
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
Да, выяснилось ... сохранил как graph.pas свою программу (c другой функцией, другим диапазоном...) до того, как проверял программу из форума... Удалил этот файл (graph.pas), т.к. по-прежнему выдавало ошибку в программе ( уже 1.PAS) . Теперь новая ошибка. Error 15: File not found (GRAPH.TPU). Курсор мигает на ; в строке Uses Graph, crt; Этот файл GRAPH.TPU, однако, сейчас после удаления graph.pas , находится по-прежнему в C:\BP\UNITS (он не удалён). Кажется, прийдётся переустанавливать Паскаль... ??? Хотя вряд ли поможет...
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
Спасибо. Осталось ещё немного: После исправлений в 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; } }
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.
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. компилируется Только оси без стрелок и обозначений (x, y, 0). Вопрос: нужно ли остальные файлы 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 - читай здесь: Директивы компилятора - про директиву $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);
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, огромное спасибо Всё получилось
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)
Да нет никакой разницы...
благодарю..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.