Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > Delphi > Паскаль
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 30.10.2006, 15:12   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Адрес: Химки
Сообщений: 13,564
Репутация: 2756
По умолчанию массивы более 64 кб

перенесено со старого форума. сообщение от Пандора.

Подскажите, как запихнуть в программу массив размером более 64 кБ?

перенесено со старого форума. сообщение от rpy3uH.

это по определению невозможно
это как то решают с помощью оверлеев...
больше я ничего не знаю
Если держаться подальше от тех мес

перенесено со старого форума. сообщение от caskov.

Проблема решается с помощью использования динамической памяти.
Допустим нужно создать двумерный массив 200*300 типа integer;
он тебует 200*300*2=120000 байт для размещения.
Заведем массив нетипизированных указателей:

var A:array[1..200] of pointer;
выделим память под него

for i:=1 to 200 do GetMem(A[i],2*300); {2 байта-размер типа integer}

далее чтобы получить доступ конкретно к компонентам иассива нужно
вычислить адрес - [сегмент:смещение]

var RealPointer:^real;
i,j:integer;

RealPointer:=ptr(Seg(A[i]^),Ofs(A[i]^)+(j-1)*2)

здесь функция ptr() возвращает указатель (j-1)*2 - прибавка к смещению Ofs(A[i]^)
таким образом элемент [i,j] адресован.
С одномерным массивом еще проще. А для двумерного я, например использую следующие процедуры записи/чтения

function elem(i:word;j: pointer):Integer;
var pr:^Integer;
begin
pr:=ptr(seg(j^),ofs(j^)+(i-1)*2);
elem:=pr^;
end;

procedure putelem(i:word;j: pointer;x:Integer);
var pr:^Integer;
begin
pr:=ptr(seg(j^),ofs(j^)+(i-1)*2);
pr^:=x;
end;

Например записать в [27,45] можно с помощью процедуры

putelem(27,A[45])
а прочитать этот же элемент - с помощью функции
elem(27,A[45]).

перенесено со старого форума. сообщение от rpy3uH.

нормально вроде...
можно просто элементы массива скидывать в файл

перенесено со старого форума. сообщение от tearnn.

А еще проще создать динамический список, где каждый элемент будет указывать кроме следующего за ним, еще на один такой же список, получится что - то вроде массива, только перевернутого. а написать процедуры(функции), для доступа к элементам этого "Массива" по индексам, мне кажется еще проще. А вообще эта задача описана в любой мало - мальски путной книге по Турбику. Остальное уже сила воображения! Успехов

Да функции эти будут конечно подлиннее чем в примере выше, но зато более удобочитаемые.(Без всяких ORD'в, SEG'в и прочего). А еще один плюс в том, что при желании можно будет увеличить этот "массив", подцепив нужное колличество элементов.
Alar вне форума   Ответить с цитированием
Старый 30.10.2006, 15:25   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Адрес: Химки
Сообщений: 13,564
Репутация: 2756
По умолчанию

перенесено со старого форума. сообщение от Пандора.

Подскажите, как запихнуть в программу массив размером более 64 кБ?

перенесено со старого форума. сообщение от Oldy.

Попробуйте создавать их динамически, в куче - Heap (GetMem, FreeMem). Работать с ними нужно через указатели.
Alar вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Музыка - и ничего более... SuperVisor Свободное общение 55 10.01.2009 23:31
СЧЁТЕСЛИ по 2 и более критериям Gadar Microsoft Office Excel 6 27.05.2008 09:25
Более 4 миллиардов MAKTE Общие вопросы C/C++ 2 16.05.2008 20:11
Два и более условий финкции If MAKEDON Общие вопросы Delphi 7 20.01.2008 10:39


00:04.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru