Помощь - Поиск - Пользователи - Календарь
Полная версия: Массивы
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Reber
Разве так нельзя писать?
Type
     a=array[1..n] of integer

Пишет Error 133...
trminator
А n перед этим описал как константу? Если да то не знаю, у меня проходит...
AlaRic
Может у тебя константа N вещественного типа?
Reber
Цитата
А n перед этим описал как константу?

Нет... Мне нужно, чтобы n с клавиатуры вводилось, и получался массив из n членов. Тогда как это сделать? Через процедуру?  ???
AlaRic
Цитата
Нет... Мне нужно, чтобы n с клавиатуры вводилось, и получался массив из n членов


Можешь вводить с клавы, скажем m, а потом присвоить это значение n.....вроде так можно.....или наоборот?
Ivs
В паскале все типы описываются до начала работы программы поэтому тут такой фокус не потянет (в этом и заключается недостаток паскаля по сравнению с бейсиком, в котором это проходит только так). Так что выхода два
1) описывай массив заранее большей размерности.
2) используй динамические структуры данных
;)
trminator
Цитата
Нет... Мне нужно, чтобы n с клавиатуры вводилось, и получался массив из n членов. Тогда как это сделать? Через процедуру?  ???

Опиши массив с запасом, например до 10000, а затем спроси число n и считай, что массив у тебя не до 10000, а до n (n<=10000)
mj
Можно запросто организовать свой сассив (в динамически распределяемой памяти и даже в расширенной вроде можно), создать функции работы с динамическим массивом и пользоватся.

Впринцыпи я бы мог написать функции эмулирующие массивы...
Alex
Напиши.Я бы с удовольствием посмотрел на них.Тем более я не очень-то разбираюсь в динамической памяти.Мож заодно как-нибудь вдуплюсь!!!
AGPA
У меня тоже такие приколы были - приходится указывать n const ... Надо попробывать записать n побольше, может получится... ;D
Demik
Да это точно в Паскале есть два не достатка:
1 Нет операции возведения
2 И нет динамических массивов

Вот собственно говаря как это можно обойти


{$R-}  {Это чтоб не было лишних ругательств smile.gif }
Type
 MyType={здесь описываешь тип элемента массива, скажем} Word;

Type
 MyArray=Array[1..1] of MyType;  {Описываем массив всего из 1 элемента}
 MyArrayPtr=^MyArray;
[color=Red][/color]
Var
 DynamicArray: MyArrayPtr;       {Это указатель на наш динамически массив}
 Count,                          {Это вводимый размер массива}
 I: Word;

Begin
 Write('Число элементов массива: '); {Вводим размер массива}
 ReadLn(Count);
 GetMem(DynamicArray,Count*SizeOf(MyType)); {выделяем по него память}
 For I:=1 to Count do DynamicArray^[I]:=I;  {заполняем наш массив значениями}
 For I:=Count downto 1 do
   WriteLn(DynamicArray^[I]);               {печатаем массив задом-наперед}
 FreeMem(DynamicArray,Count*SizeOf(MyType)) {уничтожаем массив}
End.

P.S. Если элементы массива более сложные (например, строки или записи),
    то стоит воспользоваться списками или коллекциями,
   
Demik
Да я так подумал можно можно может и матрицу сделать динамическую..

Если MyType бедет не Word, а MyType=Array[1..1] of Word и с этим куском сделать тоже самое что и спервым.

:DХотя предется писать еще несколько процедур для работы!!!!
SKVOZNJAK
Цитата
: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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.