Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Открытые массивы


Автор: ilyuha 10.7.2007, 16:59
Здрасьте
ситуация такая:
я пишу прогу по обработке БД. заранее, естественно, количество ее элементов не известно. я решил заюзать открытые массивы, но до этого я их не использовал... только читал про них. и тут же возникла проблема.
к примеру, если я пишу
... 
mytype=array of integer;
...

то компилятор материться на отсутствие индексов...

подскажите плиз, в чем трабла?

ЗЫ юзаю я BP7

Автор: nmn 10.7.2007, 20:26
в паскале нет открытых массивов, можно использовать списки

Автор: ilyuha 10.7.2007, 20:54
nmn, как так? везде пишут, что открытые массивы введены с 7-ой версии

Автор: Throne 10.7.2007, 21:14
в трех разных изданиях (на бумаге) посмотрел статьи про массивы. нигде такого нет.

Автор: nmn 10.7.2007, 21:55
при передаче массива параметром индексы не указываются это правда, но сколько я писал на паскале на 7 версии массивов без индексов не встречал   smile 

Автор: ilyuha 10.7.2007, 22:49
nmn, блин. а как же быть? под мою задачу списками довольно геморно будет smile и довольно медленно(((

Автор: greenpc 11.7.2007, 11:46
ilyuha
типа того 
Код

Type 
  TMyArray=Array[1..1] of Integer;
  PTMyArrayr=^TMyArray;

Var 
  MyArray: PTMyArray;
  Count,  i: integer;

Begin
  Write('размерность: ');
  ReadLn(Count);
  GetMem(MyArray,Count*SizeOf(Integer));
  for i:=1 to Count do begin
     MyArray^[i]:=i;
     write(MyArray^[i]);
  end;
  FreeMem(MyArray, Count*SizeOf(Integer));
end;

Автор: ilyuha 11.7.2007, 12:40
Хм, такое мне и в голову не приходило smile а не будет материться на выход за пределы индексов???

Автор: Nite 11.7.2007, 16:03
В BP7 нельзя выходить за границы сегмента. Поэтому максимальное число элементов массива, если они integer, будет порядка 32700. В общем случае, размер данных не должен превышать 65520 байт. Это число надо разделить на размер одного элемента (2 байта для integer), получишь максимальный размер массива.

Чтобы не ругалось про выход за границы массива, можно описать тип так

TMyArray=Array[1..32700] of Integer;

И при обращениях к элементами придется индекс проверять явно, чтобы не было выхода за границы.

Автор: ilyalyu 11.7.2007, 17:05
Странно, что нет открытых масивов. Пиши на Delphi или на FreePascal - там есть.

Автор: ilyuha 11.7.2007, 19:41
Цитата(Nite @  11.7.2007,  16:03 Найти цитируемый пост)
TMyArray=Array[1..32700] of Integer;

имхо, не лучший способ... я хочу грамотно юзать память

Цитата(ilyalyu @  11.7.2007,  17:05 Найти цитируемый пост)
Пиши на Delphi или на FreePascal 

боюсь, что нельзя... мы изучали борланд паскаль, и  эта прога должна быть..... ммм.... короче, мне ее надо написать и по ней сделать курсавик... и я думаю надо юзать BP7 или TP7


народ, помогите организовать данные плиз smile 

Автор: nmn 13.7.2007, 16:46
ну так используй списки или как сказал greenpc, чем не открытый массив?

Добавлено через 4 минуты и 58 секунд
Цитата(Nite @  11.7.2007,  16:03 Найти цитируемый пост)
TMyArray=Array[1..32700] of Integer;

чем неграмотно данное использование памяти?
ведь это будет не статический массив, ты сам будешь выделять память, а данная запись только что бы успокоить компилятор.

Автор: ilyuha 13.7.2007, 19:09
nmn, тогда прошу прощения у Nite... я его не правильно понял


а вообще, посоветуйте, с чем гемора менььше будет, со списками или с таким массивом?

Автор: nmn 13.7.2007, 21:26
списки гибче, но там нужно время для поиска элемента, у массивов же время поиска отсутствует - там сразу известно где находится элемент, но отсутствует та гибкость, которая присуща спискам, нельзя так же легко поменять расположение элементов(это справедливо для структуированых типов), нельзя передавать элементы из одного массива в другой как в списках, там можно очень лего перебросить элемент из одной записи в другую и др.

Автор: volvo877 15.7.2007, 01:26
Цитата(ilyalyu @  11.7.2007,  17:05 Найти цитируемый пост)
Странно, что нет открытых масивов.

Может быть уже можно научиться называть вещи своими именами? Есть в Паскале открытые массивы (a.k.a open arrays), только автору нужны не открытые, а динамические - это разные вещи.

Код

procedure p(var a: array of integer); { <-- Вот A - это открытый массив }
begin
  ...
end;

nmn, теперь о твоем перле:

Цитата(nmn @  13.7.2007,  21:26 Найти цитируемый пост)
нельзя так же легко поменять расположение элементов (это справедливо для структуированых типов)
Пример таких структурированных типов, которые не позволяют обменивать элементы массива между собой, можно привести?

Автор: ilyalyu 15.7.2007, 12:04
Цитата(volvo877 @ 15.7.2007,  01:26)
Может быть уже можно научиться называть вещи своими именами? Есть в Паскале открытые массивы (a.k.a open arrays), только автору нужны не открытые, а динамические - это разные вещи.

Извиняюсь.. Грамоте плохо обучен. Действительно, правильно - динамические  smile 

Автор: nmn 15.7.2007, 13:18
Цитата(volvo877 @  15.7.2007,  01:26 Найти цитируемый пост)
Пример таких структурированных типов, которые не позволяют обменивать элементы массива между собой, можно привести?


нет таких  smile, но ты вчитайся получше в фразу

Автор: ilyuha 15.7.2007, 14:28
Цитата(volvo877 @  15.7.2007,  01:26 Найти цитируемый пост)
Есть в Паскале открытые массивы 

Тогда почему компилятор ругаеться?
и почему тогда именно для моих целей открытые массивы не подойдут?

ЗЫ извиняюсь за ламерские вопросы,просто не юзал я их никогда

Автор: ilyalyu 18.7.2007, 18:21
ilyuha,

как тут правильно подсказали, открытые масивы - это не совсем то. проще пояснить на примере.

пример динамического масива:
Код

var arr: array of char;


пример открытого масива:
Код

procedure f(arr: array of char);
begin
  ...
end;

такой код позволяет передавать в функцию массив любой длины. если хочешь убедиться что открытый масив это не то же самое, что и динамический, попробуй в теле функции написать SetLength(arr, 1) и посмотри на ошибку.

впрочем, это вопрос терминологии.

Автор: ilyuha 21.7.2007, 20:18
спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)