IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Массивы
Reber
сообщение 25.11.2002 13:10
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 44

Репутация: -  0  +


Разве так нельзя писать?
Type
     a=array[1..n] of integer

Пишет Error 133...


--------------------
Играйте в футбол
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 25.11.2002 14:48
Сообщение #2


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


А n перед этим описал как константу? Если да то не знаю, у меня проходит...


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 25.11.2002 16:33
Сообщение #3


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Может у тебя константа N вещественного типа?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Reber
сообщение 25.11.2002 18:17
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 44

Репутация: -  0  +


Цитата
А n перед этим описал как константу?

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


--------------------
Играйте в футбол
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 25.11.2002 19:18
Сообщение #5


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


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


Можешь вводить с клавы, скажем m, а потом присвоить это значение n.....вроде так можно.....или наоборот?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ivs
сообщение 25.11.2002 19:23
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 209

Репутация: -  0  +


В паскале все типы описываются до начала работы программы поэтому тут такой фокус не потянет (в этом и заключается недостаток паскаля по сравнению с бейсиком, в котором это проходит только так). Так что выхода два
1) описывай массив заранее большей размерности.
2) используй динамические структуры данных
;)


--------------------
Если вы хотите чаще встречаться с понравившейся девушкой установите ей Windows'95
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 26.11.2002 11:25
Сообщение #7


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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

Опиши массив с запасом, например до 10000, а затем спроси число n и считай, что массив у тебя не до 10000, а до n (n<=10000)


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
mj
сообщение 2.12.2002 0:30
Сообщение #8


Adminь
****

Группа: Администраторы
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

Репутация: -  5  +


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

Впринцыпи я бы мог написать функции эмулирующие массивы...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Alex
сообщение 2.12.2002 15:49
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 201

Репутация: -  0  +


Напиши.Я бы с удовольствием посмотрел на них.Тем более я не очень-то разбираюсь в динамической памяти.Мож заодно как-нибудь вдуплюсь!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AGPA
сообщение 7.12.2002 15:16
Сообщение #10





Группа: Пользователи
Сообщений: 4

Репутация: -  0  +


У меня тоже такие приколы были - приходится указывать n const ... Надо попробывать записать n побольше, может получится... ;D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Demik
сообщение 19.11.2003 23:26
Сообщение #11





Группа: Пользователи
Сообщений: 4

Репутация: -  0  +


Да это точно в Паскале есть два не достатка:
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. Если элементы массива более сложные (например, строки или записи),
    то стоит воспользоваться списками или коллекциями,
   
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Demik
сообщение 19.11.2003 23:29
Сообщение #12





Группа: Пользователи
Сообщений: 4

Репутация: -  0  +


Да я так подумал можно можно может и матрицу сделать динамическую..

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

:DХотя предется писать еще несколько процедур для работы!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
SKVOZNJAK
сообщение 22.11.2003 10:15
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Цитата
: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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 25.07.2025 8:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"