Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 243
от 13.02.2004, 20:20

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 415
Отправлено ответов: 1492
Активность: 359.5 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Strory
Статус: Доверительный
Общий рейтинг: 148.57
[Подробней >>]
_vt
Статус: Профессиональный
Общий рейтинг: 117.83
URL: Тест
[Подробней >>]
Pawel
Статус: Опытный
Общий рейтинг: 164
[Подробней >>]
 
Andy
Статус: Опытный
Общий рейтинг: 101.55
[Подробней >>]
Boriss
Статус: Профессиональный
Общий рейтинг: 153.26
URL: Программирование на Паскале
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.6
[Подробней >>]
 
sir henry
Статус: Профессиональный
Общий рейтинг: 160.07
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 116.58
[Подробней >>]
samum2000
Статус: Опытный
Общий рейтинг: 122.58
[Подробней >>]
 
Vitally
Статус: Доверительный
Общий рейтинг: 153.57
[Подробней >>]
Tancho
Статус: Профессиональный
Общий рейтинг: 150.9
Телефон: сл. 0359 0391 65 631; 0359 0391 53 105
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 415. Люди, объясните тупому, почему в программе (см.проиложение) нельзя задать a:array [1..1000,1..1000] ... (ответов: 11)

Вопросов: 1, ответов: 11


 Вопрос № 415

Люди, объясните тупому, почему в программе (см.проиложение) нельзя задать a:array [1..1000,1..1000] of integer; ?


Приложение:


Вопрос отправлен: 10.02.2004, 20:14
Отправитель: thirteenth

[Следующий вопрос >>] [Список вопросов]

Отвечает Strory

Добрый вечер, thirteenth!
А всё от того, что область памяти, отведённая на хранение переменных, имеет ограниченный объём. А именно 65535 байт. Учитывая тот факт, что одна переменная типа Integer занимает в памяти 2 байта, а в массиве 1000х1000 таких переменных будет 1000000, и проведя несложные подсчёты в уме получаем 2000000 байт. Именно столько будет занимать массив типа Integer, а на мой взгляд это несколько больше чем 65535 :)
Если Вы всё-таки хотите создать такой большой массив, то без динамического распределения данных Вам не обойтись. В таком случае станет возможным использовать всю имеющуюся на компе память (это в идеале с использованием определённых библиотек, на сколько я помню, а в реальности станет доступно где-то 300-400 Кб, но и это меньше, чем требуется). Короче говоря столь немаленький массив без труда сделать не получится.
Попробуйте шаблончик из приложения. Это и ответ на прошлый вопрос и попытка решить новую проблему.
Удачи :)

Приложение:

Ответ отправлен: 11.02.2004, 20:34
Отправитель: Strory


Отвечает _vt

Добрый день, thirteenth!
Потому как под такую переменную необходимо как минимум 1000*1000*2=2Мб, а максимально Паскаль может выделить 64кБ на переменные и 64 кБ на код. Для решения проблемы, надо использовать динамические переменные или Паскаль под Windows =)
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 10.02.2004, 21:06
Отправитель: _vt


Отвечает Pawel

Приветствую Вас, thirteenth!
Советую читать сообщения компилятора!
Pascal не может выделить память под матрицу таким размером(примерно 2,5 Mb).
Нужно либо разбить её на несколько массивов либо выделять память ручками.


Ответ отправлен: 10.02.2004, 21:11
Отправитель: Pawel


Отвечает Andy

Доброе время суток, thirteenth!
Можно было программу и не писать, просто спросил почиму нельзя задать массив integer 1000 на 1000 и всё...
Да потому, что:
1. Смотрим в хелпе сколько байт занимает тип integer(16 бит = 2 байта).
2. Умножаем 1000*1000*2 = 2000000.
А размер непрерывного блока данных, как ты знаешь, в реал моде не может занимать более 65536 байт.

Ответ отправлен: 11.02.2004, 06:19
Отправитель: Andy


Отвечает Boriss

Добрый день, thirteenth!
Общий размер данных не может превысить 65535 байт. Ограничение это можно обойти с помощью динамической памяти
А у Вас сколько: 1000*1000*2 = ?
Ясно?

Ответ отправлен: 11.02.2004, 07:56
Отправитель: Boriss


Отвечает vitya

Здравствуйте, thirteenth!

Памяти не хватит. Сегмент данных в паскале 64kb, а ты хочешь ~2 мегабайт данных. Выделяй в динамической памяти массив.

Ответ отправлен: 11.02.2004, 08:50
Отправитель: vitya


Отвечает sir henry

Здравствуйте, thirteenth!
Потому что массив в старом досовском паскале должен занимать размер не более 64 кБ.
Если массив должен быть больше, то пользуйтесь или связанными списками, или коллекциями.

Ответ отправлен: 11.02.2004, 08:59
Отправитель: sir henry


Отвечает Ayl

Здравствуйте, thirteenth!
Потому что для ДОСа размер сегмента данных ограничен 64К. А в реале максимальный размер переменной не может превышать размера 65520 байт. А размер массива array [1..1000, 1..1000] of Integer составляет 1000*1000*2 байт = 2000000 байт, что чуть меньше 2Мб, но значительно больше 64Кб.


Ответ отправлен: 11.02.2004, 11:15
Отправитель: Ayl


Отвечает samum2000

Добрый день, thirteenth!
Потому что суммарный размер твоей структуры составит 2000000 байт, а максимально допустимый в паскале размер - 65535 байт (65кБ). Остается только довольствоваться матрицей 180х180, или начинать работать с динамической памятью.

Ответ отправлен: 11.02.2004, 13:18
Отправитель: samum2000


Отвечает Vitally

Добрый день, thirteenth!
Тысяча элементов по тысяче элементов = 1000000. Integer = 2 байта. Итого - 2 миллиона байт. Максимальный размер, который Борланд может выделить под 1 массив = 65536 байт (однако Борланд рекомендует использовать 65528).
Вот и все. Просто не хватает памяти.


Ответ отправлен: 12.02.2004, 01:12
Отправитель: Vitally


Отвечает Tancho

Доброе время суток, thirteenth!
Потому что в Borland(Turbo) Pascal'e под DOS для объявление переменных и массивах отводиться всего один сегмент ( 65536) ячеек памяти, кроме того переменные Integer
занимает 2 байт памяти, а 1000 х 1000 х 2 = 2 000 000 байть
в несколько раза больше чем имееться в разположеннии и поетому компилатор даеть сообщение о ошибке!

Ответ отправлен: 12.02.2004, 13:26
Отправитель: Tancho



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (25)
C / C++ (14)
Perl (3)
Builder / Delphi (19)
Pascal (18)
Basic / VBA (9)
Java / JavaScript (4)
PHP (13)
Криптография (5)
WinAPI (10)
Радиоэлектроника (6)
Пользователю
Windows 95/98/Me (39)
Windows NT/2000/XP (56)
"Железо" (33)
Поиск информации (15)
Администратору
Windows NT/2000/XP (29)
Linux / Unix (10)
Юристу
Гражданское право (15)
Семейное право (10)
Трудовое право (12)
КоАП (10)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное