Цитата
:DХотя предется писать еще несколько процедур для работы!!!!
Да уж ещё несколько процедур наверно понадобятся :)
Вот как примерно может выглядеть файловый массив для одновременного использования разных типов переменных. Если почаще "попадать" в 512 байтное окно, то обращения к диску будут минимальные. Вместо типизованных констант, можно использовать гл. перемееные.
UNIT CEBURAS;
interface
FUNCTION PAKMAN(FAG:BYTE;DUR,BAIT:LONGINT):LONGINT;{(ФЛАГ,АДРЕС(>0),БАЙТ)}
{ФЛАГИ: 1 - BYTE ЗАПИСЬ, 2 - BYTE ЧТЕНИЕ, 3 - INTEGER ЗАПИСЬ,
4 - INTEGER ЧТЕНИЕ, 7 - WORD ЗАПИСЬ, 8 - WORD ЧТЕНИЕ,
9 - LONGINT ЗАПИСЬ, 10 - LONGINT ЧТЕНИЕ}
PROCEDURE PAKIN(UU:STRING;ZZ:LONGINT);{СОЗДАНИЕ ФАЙЛА С ИМЕНЕМ ЗАДАННЫМ В
UU:STRING И ДЛИНОЙ РАВНОЙ ZZ*512}
PROCEDURE PAKEEV(UU:STRING); {ПРИВЯЗКА МАССИВА К УЖЕ ГОТОВОМУ ФАЙЛУ,
UU:STRING - ИМЯ ЭТОГО ФАЙЛА}
PROCEDURE PAKFIG;{ОБНУЛЕНИЕ ТЕКУЩЕГО СЕГМЕНТА БЕЗ ЗАПИСИ РЕЗУЛЬТАТОВ В ФАЙЛ}
PROCEDURE PAKMENT;{ЗАПИСЬ ТЕКУЩЕГО СЕГМЕНТА В ФАЙЛ}
implementation
USES CRT,DOS;
VAR Q7: FILE;
Q8: LONGINT; {ДЕЙСТВУЮЩИЙ СЕГМЕНТ(ПРИ ПЕРВОМ СЕГМЕНТЕ Q8=0)}
{UY:STRING[12]; }
CONST U:ARRAY[0..511] OF BYTE =(
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
PROCEDURE CVB(J,K:LONGINT);
BEGIN
RESET(Q7,1); SEEK(Q7,J);
BLOCKWRITE(Q7,U,512); CLOSE(Q7);
RESET(Q7,1); SEEK(Q7,K);
BLOCKREAD(Q7,U,512); CLOSE(Q7);
END;
PROCEDURE CXB(K:LONGINT); {СОВМЕЩЕНИЕ СЕГМЕНТОВ}
VAR E: WORD;
Q,W,T: LONGINT;
BEGIN
T:=K DIV 512;
E:=K MOD 512;
IF T>0 THEN BEGIN
IF E>0 THEN T:=T+1;
END;
IF Q8<>T THEN BEGIN
Q:=Q8*512;
W:=T*512;
CVB(Q,W);
Q8:=T;
END;
END;
FUNCTION PAKMAN(FAG:BYTE;DUR,BAIT:LONGINT):LONGINT;
LABEL 1, 100;
VAR Q, W: LONGINT;
F :^INTEGER;
G :^WORD;
R :^LONGINT;
BEGIN
Q:=DUR-1;
CXB(Q);
W:=Q MOD 512;
CASE FAG OF
1: BEGIN {BYTE ЗАПИСЬ}
U[W]:=BAIT;
PAKMAN:=0;
GOTO 100;
END;
2: BEGIN {BYTE ЧТЕНИЕ}
PAKMAN:=U[W];
GOTO 100;
END;
3: BEGIN {INTEGER ЗАПИСЬ}
IF W=511 THEN GOTO 1;
F:=ADDR(U[W]);
F^:=BAIT;
PAKMAN:=0;
GOTO 100;
END;
4: BEGIN {INTEGER ЧТЕНИЕ}
IF W=511 THEN GOTO 1;
F:=ADDR(U[W]);
PAKMAN:=F^;
GOTO 100;
END;
7: BEGIN {WORD ЗАПИСЬ}
IF W=511 THEN GOTO 1;
G:=ADDR(U[W]);
G^:=BAIT;
PAKMAN:=0;
GOTO 100;
END;
8: BEGIN {WORD ЧТЕНИЕ}
IF W=511 THEN GOTO 1;
G:=ADDR(U[W]);
PAKMAN:=G^;
GOTO 100;
END;
9: BEGIN {LONGINT ЗАПИСЬ}
IF W>508 THEN GOTO 1;
R:=ADDR(U[W]);
R^:=BAIT;
PAKMAN:=0;
GOTO 100;
END;
10: BEGIN {LONGINT ЧТЕНИЕ}
IF W>508 THEN GOTO 1;
R:=ADDR(U[W]);
PAKMAN:=R^;
GOTO 100;
END;
END;
1: WRITELN('ВВЕДЕНЫ НЕПРАВИЛЬНЫЕ ДАННЫЕ: ФЛАГ=',FAG,' СМЕЩЕНИЕ=',Q8,' ');
SOUND(120);DELAY(2000);SOUND(70);DELAY(1000);
100: END;
PROCEDURE PAKIN(UU:STRING;ZZ:LONGINT);
VAR Q:LONGINT;
W:ARRAY[0..511] OF LONGINT;
BEGIN
Q8:=0;
ASSIGN(Q7,UU); REWRITE(Q7,1);
FOR Q:=1 TO ZZ DO BLOCKWRITE(Q7,W,512);
CLOSE(Q7);
END;
PROCEDURE PAKEEV(UU:STRING);
BEGIN
Q8:=0;
ASSIGN(Q7,UU);
END;
PROCEDURE PAKFIG;
VAR W: WORD;
BEGIN
FOR W:=0 TO 511 DO U[W]:=0;
END;
PROCEDURE PAKMENT;
VAR W:LONGINT;
BEGIN
W:=Q8*512;
RESET(Q7,1); SEEK(Q7,W);
BLOCKWRITE(Q7,U,512); CLOSE(Q7);
END;
BEGIN
END.