Предел сегмента данных в 64K
Из раскопок:
- В: Может ли Borland Pascal использовать статические переменные с размером более чем 64 килобайта?
- О: Нет!
- В: Вы говорите *статические* переменные. Неужели есть что-то еще, с чем можно работать?
- О: Да, смотри ниже одно из решений проблемы. Можете не тратить время на чтение следующего текста, все равно это не работает, можете смело скроллировать вниз.
- В: Поможет разделение большого массива на несколько маленьких (все элементы меньше чем 64k, но в сумме больше чем 64k)?
- О: Нет!
- В: Поможет объявление нескольких переменных в модуле?
- О: Нет!
- В: Поможет объявление чего-либо в секции реализации модуля?
- О: Нет!
- В: Поможет использование защищенного режима Borland Pascal 7?
- A: Нет!
- В: Вы уверены??
- О: Да!!
- В: Почему??
- О: Во-первых, все программы, созданные на Borland Pascal, для любых переменных используют только один сегмент данных, во-вторых, процессоры Intel 80xxx ограничивают размер сегмена 64 килобайтами.
- В: Это глупо!!
- О: Скажите это Borland!! (Или Intel, ...или обоим).
- В: Есть ли выход из тупика?
- О: Да! Возможны два решения:
1) не используйте *СТАТИЧЕСКИЕ* переменные для хранения данных большого размера. В итоге это позволит разместить более чем 64k данных, но весь массив данных в 64k не поместится, таким образом вы его поделите на несколько частей, что не является решением проблемы. Сделайте переменные динамическими.
2) используйте другой компилятор: есть несколько доступных компиляторов языка Pascal, которые более-менее Borland-совместимые и не имеют таких ограничений (они 32-битные).
type
arr = array [1..30000] of longint; { это ваши данные }
arrptr = ^arr; { это указатель на данные } var data : arrptr; { это переменная, содержащая указатель } begin if memavail < sizeof(arr) then halt; { проверяем наличие доступной памяти } new (data); { распределяем память } for i := 1 to 30000 do data^[i]:=0; { используем ее, обратите здесь внимание на символ ^ !! } dispose (data); { освобождаем память } end. |
Примечание: данные можно описать и таким способом:
var data : array [1..10000] of arrptr; |
Всегда распределяйте память Кучи прежде, чем вы решитесь ее использовать. В противном случае вы можете получить одну из следующих ошибок системы: при использовании программ, разработанных на C - "General Protection Violation" (Общее нарушение защиты), разработанных с использованием других инструментов и языков - "Protected Mode Exception #13" (Исключительная ситуация защищенного режима) или иные. В режиме реального времени программа обычно не вызывает такую ошибку, она просто молча перезапишет другие данные, или то, что попадется под руку - саму себя, другие программы, DOS, все, что может оказаться в памяти.
Это может повлечь за собой все что угодно, вплоть до холодной перезагрузки с выключением PC от сети, но может и не иметь никакого эффекта. В особо крайнем случае возможна перезапись данных на жестком диске. Но это в теории и вряд ли возможно.
Не доступен для Linux,
Не доступен для OS/2.
[000147]