Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2006, 14:12   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию массивы более 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, 14:25   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Музыка - и ничего более... SuperVisor Свободное общение 55 10.01.2009 22: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 09:39