Не могу понять ошибку в коде Pascal [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 2 года назад .
Я пытаюсь запустить следующий код на Паскале:
const MAXSZ=100; MAXBLOCKS=40; type LineDescript=record N:byte; bl_len:array[1..MAXBLOCKS] of byte; end; PAByte=^AByte; AByte=array[1..MAXSZ*MAXSZ] of byte; var pict:array[1..MAXSZ,1..MAXSZ] of byte; Lines:array[boolean,1..MAXSZ] of LineDescript; need_refresh:array[boolean,1..MAXSZ] of boolean; cells:array[-1..MAXSZ] of byte; can_one:array[-1..MAXSZ] of boolean; can_zero:array[-1..MAXSZ] of boolean; bl_len:array[0..MAXBLOCKS] of byte; tb_res:array[1..MAXBLOCKS,1..MAXSZ] of shortint; XSz,YSz:byte; sol_found:boolean; fout:text; ErrorLevel:byte; procedure Init; var fv:text; i,j:byte; Begin assign(fv,'japan.dat'); reset(fv); readln(fv,YSz); for i:=1 to YSz do begin read(fv,Lines[true,i].N); for j:=1 to Lines[true,i].N do read(fv,Lines[true,i].bl_len[j]); need_refresh[true,i]:=true; readln(fv); end; readln(fv,XSz); for i:=1 to XSz do begin read(fv,Lines[false,i].N); for j:=1 to Lines[false,i].N do read(fv,Lines[false,i].bl_len[j]); need_refresh[false,i]:=true; readln(fv); end; close(fv); for j:=1 to YSz do for i:=1 to XSz do pict[j,i]:=2; sol_found:=false; assign(fout,'japan.sol'); rewrite(fout); End; procedure AnalyzeLine(kind:boolean;number:byte); var bl_len:array[0..MAXSZ] of byte; N,L:byte; function TryBlock(theblock,thestart:shortint):boolean; var i,startnext:shortint; res:boolean; Begin if (theblock>0) and (tb_res[theblock,thestart]<>-1) then begin TryBlock:=(tb_res[theblock,thestart]=1); exit end; for i:=thestart to thestart+bl_len[theblock]-1 do if cells[i]=0 then begin tb_res[theblock,thestart]:=0; TryBlock:=false; exit end; if theblock'); sol_found:=true; for j:=1 to YSz do begin for i:=1 to XSz do if pict[j,i]=1 then write(fout,'*') else write(fout,'.'); writeln(fout); end; End; procedure Try(y,x:byte); var i,j,i_,j_:byte; p:PAByte; Begin ErrorLevel:=0; IterateLineLook; if ErrorLevel<>0 then exit; j:=y; i:=x; while (j<=Ysz) and (pict[j,i]<>2) do if i=XSz then begin i:=1; j:=j+1 end else i:=i+1; if j>YSz then (*знайдено розв'язок*) OutputSolution else begin (*потрiбно пробувати*) GetMem(p,XSz*YSz); for j_:=1 to YSz do for i_:=1 to XSz do p^[XSz*(j_-1)+i_]:=pict[j_,i_]; pict[j,i]:=0; need_refresh[true,j]:=true; need_refresh[false,i]:=true; Try(j,i); for j_:=1 to YSz do for i_:=1 to XSz do pict[j_,i_]:=p^[XSz*(j_-1)+i_]; FreeMem(p,XSz*YSz); pict[j,i]:=1; need_refresh[true,j]:=true; need_refresh[false,i]:=true; Try(j,i); end; End; BEGIN Init; Try(1,1); if sol_found then writeln(fout,'') else writeln(fout,''); close(fout); END.
и получаю такую ошибку:
Program1.pas(155) : Встречено 'Try', а ожидался идентификатор
Подскажите, пожалуйста, в чём проблема.
ERRORLEVEL это не %ERRORLEVEL%
У командный процессора cmd.exe есть такая вещь — уровень ошибки (error level). Это код выхода (exit code) программы, которую вы запускали последней. Проверить уровень ошибки можно при помощи команды IF ERRORLEVEL .
IF ERRORLEVEL 1 ECHO error level is 1 or more
Проверка IF ERROR LEVEL n срабатывает, если уровень ошибки n или выше. Это, вероятно, потому, что многие программы выражают разную степень ошибки все большими и большими кодах выхода. К примеру, программа diff имеет 3 кода выхода: «0» означает, что файлы одинаковые, «1» — разные, «2» — случилось что-то страшное. Некоторые программы используют код выхода «0» для успеха и все остальное для ошибки.
Вдобавок к этому внутреннему состоянию, вы, если хотите, можете создать переменную окружения с именем ERRORLEVEL , так же, как вы можете создать переменную с именем FRED . Но, как и FRED , эта переменная не повлияет на уровень ошибки.
rem this next command sets the error level to zero
CMD /C EXIT 0
set ERRORLEVEL=1
if ERRORLEVEL 1 echo Does this print?
Сообщение не будет отображено, поскольку переменная ERRORLEVEL не имеет никакого влияния на уровень ошибки. Это просто переменная, имя которой совпадает с концепцией командного процессора.
set BANKBALANCE=$1 000 000,00
«Эй, когда я пытаюсь снять денег, у меня ошибка — „недостаточно денег на счету“».
Однако, есть вариант, когда включено расширенный режим командного процессора, и вы используете %ERRORLEVEL% .
В этом случае командный процессор ищет переменную с таким именем и, если не находит, заменяет %ERRORLEVEL% на текущее значение внутреннего уровня ошибки. Это запасной вариант — как указать адрес соседа запасным адресом доставки товара, на случай, если вас нет дома. Однако это не повлияет на посылки, доставляемые соседу.
То же поведение и у %CD% : если вы не установили переменную с таким именем, подставляется текущий каталог командного процессора. Но изменить каталог при помощи set CD=C:\Windows нельзя.
Вероятно, есть несколько причин для такого поведения:
— Чтобы можно было вывести уровень ошибки в лог:
ECHO error level is %ERRORLEVEL%>logfile
— Чтобы можно было выполнять другие сравнения с уровнем ошибки — например, чтобы проверять равенство:
IF %ERRORLEVEL% EQU 1 echo Different!
Но я отклонился от темы. На сегодня мой тезис такой: уровень ошибки — это не то же самое, что переменная %ERRORLEVEL%.
Как выставить errorlevel pascal
Как создать код завершения программы (наподобие своего ErrorLevel)
После завершения скрипта с ошибкой errorlevel равен 0
Имеем скрипт вида exit(1) или import sys sys.exit(1) или z = 1 / 0 или raise.
Как получить код завершения программы?
Как получить код завершения приложения? Как можно аварийно закрыть приложение, что бы результат.

Как в консольном приложении по окончанию работы программы задать возврат кода ошибки (ErrorLevel)
Вот возьмем консольный WinRar, к примеру. Код возврата|Описание 0|Операция успешно завершена.
Как долго потоку с приоритетом 28 придется ждать своего выполнения после завершения операции ввода-вывода?
Предположим, что установлен размер кванта 20 мс и текущий поток (с приоритетом 24) только что.
установив ERRORLEVEL в 0
У меня есть командный файл, который является оберткой вокруг установщика. Этот пакетный файл проверяет уровень ошибок, возвращаемый установщиком, и печатает соответственно.
Я заметил, что если я выполню set ERRORLEVEL=0 в командной строке прямо перед тем, как запустить пакетный файл (в том же окне / среде команды), установщик никогда не помешает уровню ошибки, и мой пакетный скрипт всегда возвращает пройденный. Я бы предположил, %ERRORLEVEL% что это переменная, определяемая Windows, которая используется специально для распечатки ошибок из программ и сценариев, и что использование переменной в командном файле или что-то еще будет «на ваш страх и риск», поскольку его можно изменить в любой момент другой процесс.
Из того, что кажется, когда я устанавливаю уровень ошибки в данной среде, это как-то прекращает использование уровня ошибок в качестве держателя кода выхода. Кто-нибудь знает, почему это? Для меня это просто странное неожиданное поведение. Любая информация по этому вопросу будет принята с благодарностью!
Вы переопределяете системную переменную в обычную. Когда вы сделаете это, система не будет использовать его, пока командный сеанс не будет закрыт.
Лучший способ будет использовать
в другой пакетный файл и вызвать его из основного сценария. Где число 0 — это то, что вам нужно errorlevel . Либо так, либо используйте команду, которая сбрасывает errorlevel для вас, например, echo, findstr и т. Д.
Например, следующие команды будут все установлены ERRORLEVEL в 0 в вашем пакетном файле:
Никогда не следует присваивать собственное значение динамическим системным переменным, таким как ERRORLEVEL, PATH, CD, DATE, TIME и т. Д. Это не позволит коду видеть динамическое значение. Вы можете восстановить динамическое значение, просто отменив определенное пользователем значение. Например:
Следующие методы работают только в MS-DOS:
Для полноты картины устанавливается ErrorLevel состояние 1 , действительное как для Windows, так и для MS-DOS:
Как выставить errorlevel pascal
Профиль
Группа: Участник
Сообщений: 31
Регистрация: 4.6.2004
Где: г. Калуга
Репутация: нет
Всего: нет
Привет Народ!
Помогите плиз. Есть сторонняя программа (EXE) которую мне надо запустить из под моей. Фишка в том что по результату своей работы она (сторонняя) возвращает досовый ERRORLEVEL, который я хочу отследить.
Как бы это реализовать. Блин меня заклинило что-то — помогите расклиниться.
Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер
Репутация: 30
Всего: 484
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Литературу по Delphi обсуждаем здесь
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Вопросы по реализации алгоритмов рассматриваются здесь
- 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
- 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
[ Время генерации скрипта: 0.1001 ] [ Использовано запросов: 21 ] [ GZIP включён ]
ERRORLEVEL это не %ERRORLEVEL%
У командный процессора cmd.exe есть такая вещь — уровень ошибки (error level). Это код выхода (exit code) программы, которую вы запускали последней. Проверить уровень ошибки можно при помощи команды IF ERRORLEVEL .
IF ERRORLEVEL 1 ECHO error level is 1 or more
Проверка IF ERROR LEVEL n срабатывает, если уровень ошибки n или выше. Это, вероятно, потому, что многие программы выражают разную степень ошибки все большими и большими кодах выхода. К примеру, программа diff имеет 3 кода выхода: «0» означает, что файлы одинаковые, «1» — разные, «2» — случилось что-то страшное. Некоторые программы используют код выхода «0» для успеха и все остальное для ошибки.
Вдобавок к этому внутреннему состоянию, вы, если хотите, можете создать переменную окружения с именем ERRORLEVEL , так же, как вы можете создать переменную с именем FRED . Но, как и FRED , эта переменная не повлияет на уровень ошибки.
rem this next command sets the error level to zero
CMD /C EXIT 0
set ERRORLEVEL=1
if ERRORLEVEL 1 echo Does this print?
Сообщение не будет отображено, поскольку переменная ERRORLEVEL не имеет никакого влияния на уровень ошибки. Это просто переменная, имя которой совпадает с концепцией командного процессора.
set BANKBALANCE=$1 000 000,00
«Эй, когда я пытаюсь снять денег, у меня ошибка — „недостаточно денег на счету“».
Однако, есть вариант, когда включено расширенный режим командного процессора, и вы используете %ERRORLEVEL% .
В этом случае командный процессор ищет переменную с таким именем и, если не находит, заменяет %ERRORLEVEL% на текущее значение внутреннего уровня ошибки. Это запасной вариант — как указать адрес соседа запасным адресом доставки товара, на случай, если вас нет дома. Однако это не повлияет на посылки, доставляемые соседу.
То же поведение и у %CD% : если вы не установили переменную с таким именем, подставляется текущий каталог командного процессора. Но изменить каталог при помощи set CD=C:\Windows нельзя.
Вероятно, есть несколько причин для такого поведения:
— Чтобы можно было вывести уровень ошибки в лог:
ECHO error level is %ERRORLEVEL%>logfile
— Чтобы можно было выполнять другие сравнения с уровнем ошибки — например, чтобы проверять равенство:
IF %ERRORLEVEL% EQU 1 echo Different!
Но я отклонился от темы. На сегодня мой тезис такой: уровень ошибки — это не то же самое, что переменная %ERRORLEVEL%.
Похожие публикации:
- Как проверить node js
- Как прошить arduino mini
- Как работать с prolife pa2 basic ad
- Как разместить кнопку по центру css
Почему возвращается неправильный %errorlevel%?
Я использую такую старенькую утилитку time-mem для измерения времени выполнения какой-то команды из командной строки.
Это просто проект на с++, основной код здесь.
Начинаю проверять, для теста запускаю timemem 7z some-err-str.
Понятно выводится ошибка, показывает код 7, возвращается этот код.
Но в батнике, если сразу за этой командой вывести echo %errorlevel%, получаю 0.
В общем ведёт себя также, как похожая утилита ptime.
Почему, у меня нет объяснения. И главное, как можно исправить?
- Вопрос задан более трёх лет назад
- 246 просмотров
Комментировать
Решения вопроса 1
Юрий @yshinkarev Автор вопроса
Да, ошибка была глупая. А я пошёл смотреть совсем в другом направлении. info() всегда возвращал 0.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1

youtube блогер, ИТ-специалист
попробуйте батник заменить на cmd’шник. и почитайте синтаксис использования.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Windows
- +4 ещё
Не видно конкретный узел в другой подсети. Почему?
- 1 подписчик
- 9 минут назад
- 7 просмотров
