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


Автор: Джесси 3.9.2006, 17:05
Здравствуйте! Помогите пожалуйста!
Как мне решить такую задачу: необходимо создать массив, содержащий 2 миллиона чисел типа integer . Скажите это реально? smile 

Автор: Alexeis 3.9.2006, 18:14
Джесси, на каком паскале? (компилятор)
Под Windows это и так должно получатся, под дос гораздо сложнее, поскольку программа написанная под дос не может превышать 640кб в реальном режиме. А вот если перейти в защищеный режим и использовать драйвер верхней памяти, то можно. Но тоже будет заморочка, поскольку к данным массива придется обращатся через "окно" в 64кБ. 

Автор: Джесси 4.9.2006, 06:06
У меня Паскаль версия 7.1. Можно хоть какой-то намек на решение моей проблемы? smile 

Автор: albertn 4.9.2006, 08:33
Цитата(Джесси @ 4.9.2006,  06:06)
У меня Паскаль версия 7.1. Можно хоть какой-то намек на решение моей проблемы? smile

Есть вариант использовать файлы. Если время не критично, то может помочь.

Автор: Alexeis 4.9.2006, 09:00
Цитата(Джесси @  4.9.2006,  06:06 Найти цитируемый пост)
У меня Паскаль версия 7.1
 Turbo Pascal 7.1 или Borland Pascal 7.1?

Автор: Джесси 4.9.2006, 16:45
Turbo Pascal 7.1. А если через файлы, то как? Все равно ведь при описании массива нужно указывать размер... smile 

Автор: Snowy 4.9.2006, 17:02
Создай файл нужного размера.
Размер файла = кол-во элементов * SizeOf(integer)

Автор: Alexeis 4.9.2006, 17:05
тогда в памяти это невозможно, а с файлом просто можно написать фукции типа
Код не проверял но думаю смысл понятен
Код

type 
  Tfilearray = record
                  f : file of integer;
                  name : String;
                  initialized : boolean
                end;

var
  mas1 : Tfilearray;

procedure Initfilearray(var mas : Tfilearray; filename : String);
begin
  mas.name :=  filename;
  assign(mas.f,  filename);
  Rewrite(f);
  initialized := true;
end;

procedure Closefilearray(var mas : Tfilearray);
begin
  Close(mas.f);
  erase(mas.f);
  initialized := false;
end;

function getInteger(var mas : Tfilearray; index : integer) : Integer;
var
  t : integer;
begin
   seek(mas.f, index);
   read(mas.f, t);
   getInteger := t;
end;

procedure setInteger(var mas : Tfilearray; index : integer; value : Integer);
begin
   seek(mas.f, index);
   write(mas.f,  value);
end;

Begin
 Initfilearray(mas1, 'mas.tmp');
 setInteger(mas1, 2, 16);
 Closefilearray(mas1);
end;

Автор: Джесси 4.9.2006, 18:13
Мне компилятор выдает: Error 102: File not assigned. Может я что-то не так понимаю. И еще я запуталась: где в программе используется функция Getinteger?  smile 

Автор: dumb 4.9.2006, 18:27
Джесси, а скажи пожалуйста, зачем тебе 2М int'ов?

alexeis1 тебе привел лишь пример использования этих функций - использовать их должна уже ты.

Автор: Джесси 4.9.2006, 18:49
Уж поймите меня правильно. Мне поставили задачу и я должна в ней разобраться и выполнить. А спросить что-то не у кого. Поэтому я обратилась к вам. Объясните пожалуйста, почему та программа не создает файл? В функции я разобралась, что там к чему. Вот только с файлом как-то не очень понятно... Уж простите меня за назойливость, но мне больше не к кому обратиться...  smile 

Автор: Alexeis 4.9.2006, 20:22
Нашел старичка BP7.0 smile  и вот что у меня получилось
Код

program mas;
uses crt;
type
  Tfilearray = record
                  f : file of integer;
                  name : String;
                  initialized : boolean
                end;

var
  mas1 : Tfilearray; {переменная масива}
  int  : longint;
  i    : longint;

procedure Initfilearray(var mas : Tfilearray; filename : String);
begin
  mas.name :=  filename;
  assign(mas.f,  filename);
  Rewrite(mas.f);                    {создаем файл}
  mas.initialized := true;
end;

procedure Closefilearray(var mas : Tfilearray);
begin
  Close(mas.f);        {закрываем файл}
  erase(mas.f);        {удаляем файл}
  mas.initialized := false;
end;

function getInteger(var mas : Tfilearray; index : longint) : Integer;
var
  t : integer;
begin
   seek(mas.f, index); {смещаемся к нужному элементу}
   read(mas.f, t);         {читаем его из файла}
   getInteger := t;
end;

procedure setInteger(var mas : Tfilearray; index : longint; value : Integer);
begin
   seek(mas.f, index);
   write(mas.f,  value); {записываем его в файл}
end;

Begin
 clrscr;
 int := 0;
 Initfilearray(mas1, 'mas.tmp');
 for i := 1000000 to 1200000
 do
   setInteger(mas1, i, i mod 32000); {заполняем массив некоторыми числами}

 for i := 1199900 to 1200000
 do
   begin
     int := GetInteger(mas1, i); {считываем сотню чисел из массива}
     writeln('value is ',int);    {выводим их на экран}
   end;

 Closefilearray(mas1); {удаляем файл и уничтожаем массив}
 readkey; {ждем нажатия любой клавиши}
end.

Автор: Джесси 4.9.2006, 20:26
Спасибо за подсказку! Кажется я поняла. smile  Если возникнут проблемы мне можно будет еще раз к вам обратиться?

Автор: Alexeis 4.9.2006, 20:36
Конечно, для этого форум и существует.

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