1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
uses graph,crt; type mas=array[1..4,1..4] of integer; var ch:char; a:mas; gd,gm,xkursor,ykursor,i,j,xzas,yzas,dxzas,dyzas,b,c:integer; p2048,menu,kmenu,helpkar,game12,proigral,win:pointer; function loader(filename:string):pointer; var sz:longint; p:pointer; f:file; begin assign(f,filename); reset(f,1); sz:=filesize(f); getmem(p,sz); blockread(f,p^,sz); close(f); loader:=p; end; procedure upr (var ch:char;var xkursor,y:integer); begin ch:=readkey; putimage(xkursor,y,kmenu^,xorput); if ch=#0 then ch:=readkey; case ch of #72: if y>99 then y:=y-220; #80: if y<550 then y:=y+220; end; if y>545 then y:=100; if y<100 then y:=540; putimage(xkursor,y,kmenu^,xorput); end; function proverka(a:mas): boolean; var i,j,k,z:integer; begin proverka:=true; for i:=1 to 4 do for j:=1 to 4 do if (a[i,j] = 0) then proverka:=false else for k:=2 to 3 do for z:= 2 to 3 do if (a[k,z] = a[k+1,z]) or (a[k,z] = a[k-1,z]) or (a[k,z] = a[k,z-1]) or (a[k,z] = a[k,z+1]) then proverka:=false else if ((a[1,j] = a[2,j]) or (a[2,j] = a[3,j]) or (a[3,j] = a[4,j])) or ((a[i,1] = a[i,2]) or (a[i,2] = a[i,3]) or (a[i,3] = a[i,4])) then proverka:=false; end; procedure gg(a:mas); var i,j:integer; begin for i:=1 to 4 do for j:=1 to 4 do if a[i,j] = 2048 then begin cleardevice; putimage(0,0,win^,xorput); end; end; procedure zastavka(var xzas,yzas,dxzas,dyzas:integer); begin putimage(xzas,yzas,p2048^,xorput); xzas:=xzas+dxzas; yzas:=yzas+dyzas; if (xzas>getmaxx-100) then dxzas:=-dxzas; if (xzas<0) then dxzas:=-dxzas; putimage(xzas,yzas,p2048^,xorput); if (yzas>getmaxy-100) then dyzas:=-dyzas; if (yzas<0) then dyzas:=-dyzas; settextstyle(1,1,1); outtextxy(0,getmaxy-20,'Game created: Podlesny Ilya'); delay(30); end; procedure game; var f:text; l,i,n,c,m1,m2,h,z,LoshadCount:Integer; max:Real; v:array[1..7] of integer; s:array[1..7] of real; begin begin clrscr; l:=0; Randomize; LoshadCount:=Random(6)+2; z:=Random(5)+3; m1:=Random(4)+2; m2:=Random(5)+6; begin assign(f,'C:UsersiDeathlessDesktopdata RacecourseInput.txt'); rewrite(f); write(f,m1); write(f,m2); close(f); end; for h:=1 to z do begin // Stavki Randomize; LoshadCount:=Random(6)+2; n:=0; repeat write('Vibirite loshad (ot 1 do ', LoshadCount,'): '); readln(n); until n in [1..LoshadCount]; // Zaezd Randomize; for i:=1 to LoshadCount do s[i]:=round(Random(m2-m1+1)+m1)*7; // Finish max:=s[1]; for i:=2 to LoshadCount do if s[i]>max then max:=s[i]; c:=0; for i:=1 to LoshadCount do if s[i]=max then begin Inc(c); v[c]:=i; end; if c=1 then begin c:=v[1]; end else begin // Fotofinish max:=max+0.001; c:=Random(c)+1; c:=v[c]; s[c]:=max; end; // Resultat Writeln; Writeln ('--------------------'); Writeln (' Sredniya'); Writeln ('Loshad skorost, Resultat'); Writeln (' km/ch'); Writeln ('--------------------'); for i:=1 to LoshadCount do begin Write (' ', i, s[i]:15:3); if i=c then Write (' POBEDITEL'); Writeln(); end; Writeln ('--------------------'); Writeln; if c=n then begin Writeln ('VI VIIGRALI !!!'); l:=l+1; end else Writeln ('Vi proigrali'); Readln; clrscr; end; end; begin assign(f,'C:UsersiDeathlessDesktopdata RacecourseOutput.txt'); rewrite(f); write(f,l); write(f,z); close(f); end; end; procedure help; begin cleardevice; putimage(0,0,helpkar^,xorput); readkey; end; begin gd:=detect; b:=9; c:=11; initgraph(b,c,''); randomize; menu:=loader('buhf/menu2.bmp'); kmenu:=loader('buhf/kursor.bmp'); helpkar:=loader('buhf/help1.bmp'); p2048:=loader('buhf/2048.bmp'); game12:=loader('buhf/game12.bmp'); proigral:=loader('buhf/pr5.bmp'); win:=loader('buhf/win.bmp'); xzas:=random(getmaxx div 2); yzas:=random(getmaxy div 2); dxzas:=random(10)+20; dyzas:=random(10)+20; putimage(xzas,yzas,p2048^,xorput); repeat zastavka(xzas,yzas,dxzas,dyzas); until keypressed; readkey; repeat xkursor:=400; ykursor:=100; cleardevice; putimage(0,0,menu^,xorput); putimage(xkursor,ykursor,kmenu^,xorput); repeat upr(ch,xkursor,ykursor); until ch=#13; case ykursor of 100:game; 320:help; end; until ykursor=540; end. |
Модераторы:Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
Dahlia
- Сообщения:1
- Зарегистрирован:17 июл 2013, 18:35
Программа в Паскале компилится, но не запускается. Ошибка «Exitcode = 1». Не понимаю, в чём дело. Зарезервированными словами переменные не обозначал. Скажите, пожалуйста, в каких случаях может возникать такая ошибка. Если нужен будет код, я его дам.
-
Naeel Maqsudov
- Сообщения:2551
- Зарегистрирован:20 фев 2004, 19:17
- Откуда:Moscow, Russia
- Контактная информация:
17 июл 2013, 23:32
Ну, наверное в программе написано EXIT(1); и она таки выполняется ровно до этого места. ![]()
-
somewhere
- Сообщения:1837
- Зарегистрирован:31 авг 2006, 17:14
- Откуда:71 RUS
- Контактная информация:
18 июл 2013, 09:46
Да не, в документации же русским по белому написано:
1. Invalid function number
An invalid operating system call was attempted.
Боюсь тут без кода никак
It’s a long way to the top if you wanna rock’n’roll
Модератор: Модераторы
как принудительно предотвратить загрузку dll (ExitCode := 1)
Добрый день.
На delphi прекрасно работает такой код
begin
DLLProc := @DLLMain;
DLLMain(DLL_PROCESS_ATTACH);
end.
……………………………………….
procedure DLLMain(Reason: DWORD);
begin
Case Reason Of
DLL_PROCESS_ATTACH :
begin // DLL_PROCESS_ATTACH
// if ….. then // какое-то условие
ExitCode := 1; //dll не будет загружаться
end; // DLL_PROCESS_ATTACH
End; //case
end;
В Free Pascal (использую 2.5.1)
ExitCode := 1 не работает
begin
DLLMain(DLL_PROCESS_ATTACH);
end.
………………………………………..
procedure DLLMain(Reason: DWORD);
begin
Case Reason Of
DLL_PROCESS_ATTACH :
begin // DLL_PROCESS_ATTACH
// if ….. then // какое-то условие
ExitCode := 1; //dll не будет загружаться
end; // DLL_PROCESS_ATTACH
End; //case
end;
Такое ощущение что ExitCode не используется при загрузке dll.
Как быть в подобной ситуации?
- vic_75
- незнакомец
- Сообщения: 2
- Зарегистрирован: 29.08.2010 14:55:33
Re: как принудительно предотвратить загрузку dll (ExitCode := 1)
А.Н. » 29.08.2010 21:06:16
begin
DLLProc := @DLLMain;
DLLMain(DLL_PROCESS_ATTACH);
end.
Не понял я где это. В DLL?
Такое ощущение что ExitCode не используется при загрузке dll.
Как быть в подобной ситуации?
1. Забыть про DllMain. Это дерьмовая штука.
2. Использовать для инициализации DLL отдельную функцию.
- А.Н.
- постоялец
- Сообщения: 230
- Зарегистрирован: 13.03.2010 12:23:58
Re: как принудительно предотвратить загрузку dll (ExitCode := 1)
vic_75 » 31.08.2010 14:22:53
Да уж…. Ответ А.Н. информативен до безобразия…..
Вообщем ничего лучшего как исправить родной system.pp (точнее syswin.inc)
и перекомпилировать RTL я не нашел.
- vic_75
- незнакомец
- Сообщения: 2
- Зарегистрирован: 29.08.2010 14:55:33
Re: как принудительно предотвратить загрузку dll (ExitCode := 1)
А.Н. » 01.09.2010 14:04:40
Ну, про DllMain много написано. Что уж тут ещё приписать-то? Лучше забыть про неё, по-моему.
Хм… Каждый раз, при обновлении среды, исправлять и перекомпилировать?
- А.Н.
- постоялец
- Сообщения: 230
- Зарегистрирован: 13.03.2010 12:23:58
Вернуться в Lazarus
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Имеется программка с меню и графикой. Компилируется нормально, но при запуске выдает exit code 1. Как с ним справиться?
uses graph,crt;
type mas=array[1..4,1..4] of integer;
var ch:char;
a:mas;
gd,gm,xkursor,ykursor,i,j,xzas,yzas,dxzas,dyzas,b,c:integer;
p2048,menu,kmenu,helpkar,game12,proigral,win:pointer;
function loader(filename:string):pointer;
var sz:longint;
p:pointer;
f:file;
begin
assign(f,filename);
reset(f,1);
sz:=filesize(f);
getmem(p,sz);
blockread(f,p^,sz);
close(f);
loader:=p;
end;
procedure upr (var ch:char;var xkursor,y:integer);
begin
ch:=readkey;
putimage(xkursor,y,kmenu^,xorput);
if ch=#0 then ch:=readkey;
case ch of
#72: if y>99 then y:=y-220;
#80: if y<550 then y:=y+220;
end;
if y>545 then y:=100;
if y<100 then y:=540;
putimage(xkursor,y,kmenu^,xorput);
end;
function proverka(a:mas): boolean;
var i,j,k,z:integer;
begin
proverka:=true;
for i:=1 to 4 do
for j:=1 to 4 do
if (a[i,j] = 0) then proverka:=false else
for k:=2 to 3 do
for z:= 2 to 3 do
if (a[k,z] = a[k+1,z]) or (a[k,z] = a[k-1,z]) or (a[k,z] = a[k,z-1]) or
(a[k,z] = a[k,z+1]) then
proverka:=false
else if ((a[1,j] = a[2,j]) or (a[2,j] = a[3,j]) or
(a[3,j] = a[4,j])) or ((a[i,1] = a[i,2]) or (a[i,2] = a[i,3]) or
(a[i,3] = a[i,4])) then proverka:=false;
end;
procedure gg(a:mas);
var
i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
if a[i,j] = 2048 then
begin
cleardevice;
putimage(0,0,win^,xorput);
end;
end;
procedure zastavka(var xzas,yzas,dxzas,dyzas:integer);
begin
putimage(xzas,yzas,p2048^,xorput);
xzas:=xzas+dxzas;
yzas:=yzas+dyzas;
if (xzas>getmaxx-100) then dxzas:=-dxzas;
if (xzas<0) then dxzas:=-dxzas;
putimage(xzas,yzas,p2048^,xorput);
if (yzas>getmaxy-100) then dyzas:=-dyzas;
if (yzas<0) then dyzas:=-dyzas;
settextstyle(1,1,1);
outtextxy(0,getmaxy-20,'Game created: Podlesny Ilya');
delay(30);
end;
procedure game;
var
f:text;
l,i,n,c,m1,m2,h,z,LoshadCount:Integer;
max:Real;
v:array[1..7] of integer;
s:array[1..7] of real;
begin
begin
clrscr;
l:=0;
Randomize;
LoshadCount:=Random(6)+2;
z:=Random(5)+3;
m1:=Random(4)+2;
m2:=Random(5)+6;
begin
assign(f,'C:UsersiDeathlessDesktopdata RacecourseInput.txt');
rewrite(f);
write(f,m1);
write(f,m2);
close(f);
end;
for h:=1 to z do
begin
// Stavki
Randomize;
LoshadCount:=Random(6)+2;
n:=0;
repeat
write('Vibirite loshad (ot 1 do ', LoshadCount,'): ');
readln(n);
until n in [1..LoshadCount];
// Zaezd
Randomize;
for i:=1 to LoshadCount do
s[i]:=round(Random(m2-m1+1)+m1)*7;
// Finish
max:=s[1];
for i:=2 to LoshadCount do
if s[i]>max then max:=s[i];
c:=0;
for i:=1 to LoshadCount do
if s[i]=max then begin
Inc(c);
v[c]:=i;
end;
if c=1 then begin
c:=v[1];
end
else begin
// Fotofinish
max:=max+0.001;
c:=Random(c)+1;
c:=v[c];
s[c]:=max;
end;
// Resultat
Writeln;
Writeln ('--------------------');
Writeln (' Sredniya');
Writeln ('Loshad skorost, Resultat');
Writeln (' km/ch');
Writeln ('--------------------');
for i:=1 to LoshadCount do begin
Write (' ', i, s[i]:15:3);
if i=c then Write (' POBEDITEL');
Writeln();
end;
Writeln ('--------------------');
Writeln;
if c=n then
begin
Writeln ('VI VIIGRALI !!!');
l:=l+1;
end
else
Writeln ('Vi proigrali');
Readln;
clrscr;
end;
end;
begin
assign(f,'C:UsersiDeathlessDesktopdata RacecourseOutput.txt');
rewrite(f);
write(f,l);
write(f,z);
close(f);
end;
end;
procedure help;
begin
cleardevice;
putimage(0,0,helpkar^,xorput);
readkey;
end;
begin
gd:=detect;
b:=9;
c:=11;
initgraph(b,c,'');
randomize;
menu:=loader('buhf/menu2.bmp');
kmenu:=loader('buhf/kursor.bmp');
helpkar:=loader('buhf/help1.bmp');
p2048:=loader('buhf/2048.bmp');
game12:=loader('buhf/game12.bmp');
proigral:=loader('buhf/pr5.bmp');
win:=loader('buhf/win.bmp');
xzas:=random(getmaxx div 2);
yzas:=random(getmaxy div 2);
dxzas:=random(10)+20;
dyzas:=random(10)+20;
putimage(xzas,yzas,p2048^,xorput);
repeat
zastavka(xzas,yzas,dxzas,dyzas);
until keypressed;
readkey;
repeat
xkursor:=400;
ykursor:=100;
cleardevice;
putimage(0,0,menu^,xorput);
putimage(xkursor,ykursor,kmenu^,xorput);
repeat
upr(ch,xkursor,ykursor);
until ch=#13;
case ykursor of
100:game;
320:help;
end;
until ykursor=540;
end.
Переменные ExitProc, ExitCode и ErrorAddr используются для установки процедуры выхода.
Указательная переменная ExitProc позволяет вам устанавливать процедуру выхода. Процедура выхода всегда вызывается при завершении программы.
Процедура выхода не требует параметров и должна компилироваться с директивой дальнего вызова (FAR).
При условии корректной установки, процедура выхода становится частью цепочки процедур выхода. Процедуры выхода в такой цепочке выполняются в порядке, обратном установке.
Чтобы сохранить цепь процедур выхода неповрежденной, вы должны сохранить текущее содержание переменной ExitProc перед изменением ее на адрес вашей собственной процедуры выхода.
Первый оператор в вашей процедуре выхода должен переустановить сохраненное значение переменной ExitProc.
Процедура выхода может получить информацию о завершении, исследуя переменную типа Integer ExitCode и указательную переменную ErrorAddr.
■ В случае нормального завершения, ExitCode = 0 и ErrorAddr = NIL.
■ В случае завершения через обращение к процедуре Halt, ExitCode
содержит значение, переданное к Halt, а ErrorAddr = NIL.
■ В случае завершения из-за ошибки во время выполнения программы,
ExitCode содержит код ошибки, а ErrorAddr содержит адрес оператора,
в котором произошла ошибка.
Последняя из процедур выхода (установленная библиотекой поддержки) закрывает стандартные файлы Input и Output. Если значение ErrorAddr не равно NIL, то выводится сообщение об ошибке во время выполнения программы.
Как только библиотека поддержки вызвала все установленные процедуры выхода, программа завершает свое выполнение и возвращается в операционную систему, передавая как код возврата значение, сохраненное в переменной ExitCode.
СООБЩЕНИЯ КОМПИЛЯТОРА ОБ ОШИБКАХ
§ Если в меню Options?Linker?Link Buffer, установлен параметр Memory, переключите его в значение Disk.
§ Возможно программа слишком велика, чтобы компилироваться в таком объеме памяти. Следует разбить ее на два или более модуля.
§ несоответствующее количество begin и end (не забудьте, что оператор case также заканчивается словом end);
§ включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле;
§ незаконченный комментарий.
§ несовместимые типы переменной и выражения в операторе присваивания;
§ несовместимые типы фактического и формального параметров в обращении к процедуре или функции;
§ тип выражения, несовместимый с типом индекса при индексировании массива;
§ несовместимые типы операндов в выражении.
§ Идентификатору функции можно присваивать значения только внутри раздела операторов данной функции.
§ Объектный файл .obj определяет идентификаторы PUBLIC, которые не находятся в сегменте CODE.
§ Идентификатор обозначает абсолютную переменную.
§ Идентификатор обозначает процедуру или функцию типа inline.
§ Файл .com содержит ссылки с размерами в байтах на перемещаемые идентификаторы. Такая ошибка происходит в случае, если вы используете операторы HIGH и DOWN с перемещаемыми идентификаторами или если вы ссылаетесь в директивах DB на перемещаемые идентификаторы.
§ Операнд ссылается на перемещаемый идентификатор, который не был определен в сегменте CODE или в сегменте DATA.
§ Операнд ссылается на процедуру EXTRN или функцию EXTRN со смещением, например CALL SortProc+8.
§ Процедуры или функции были описаны с помощью описания forward, но их определение не найдено.
§ Вы пытаетесь осуществить приведение типа выражения, когда разрешается только ссылка на переменную, процедуру или функцию.
§ Вы пытаетесь присвоить константу вне диапазона переменной.
§ Вы пытаетесь передать константу вне диапазона в качестве параметра процедуре или функции.
Размер локальных переменных, описанных в программе или функции, не может превышать 64 Кбайт.