OberonCore https://forum.oberoncore.ru/ |
|
Большие массивы https://forum.oberoncore.ru/viewtopic.php?f=35&t=350 |
Страница 1 из 2 |
Автор: | Pavel [ Понедельник, 11 Декабрь, 2006 09:16 ] |
Заголовок сообщения: | Большие массивы |
Доброе время суток. Рад всех приветствовать. Работаю с BlackBox с середины августа этого года. Учащиеся начали изучать с сентября. При решении задач с большими массивами (8-9 класс) возникли проблемы: Описываю массив TYPE massiv=ARRAY 32767 OF SHORTINT; VAR a: ARRAY 32767 OF massiv; и далее, например заполнение по спирали. И система при компилировании ошибок не выдает, но при выполнении выбрасывает из системы или пишет "steck overflow ..." при меньших размерах массива программа работает идеально. Спасибо. |
Автор: | Иван Горячев [ Понедельник, 11 Декабрь, 2006 10:34 ] |
Заголовок сообщения: | Re: Большие массивы |
А полностью процедуру можно? |
Автор: | Сергей Губанов [ Понедельник, 11 Декабрь, 2006 11:13 ] |
Заголовок сообщения: | Re: Большие массивы |
Pavel писал(а): TYPE massiv=ARRAY 32767 OF SHORTINT;
VAR a: ARRAY 32767 OF massiv; "steck overflow ..." 32767 * 32767 * 2 = 2'147'352'578 Если размер переменной равен двум гигабайтам, то ничего удивительного в этом нет. |
Автор: | Иван Горячев [ Понедельник, 11 Декабрь, 2006 11:14 ] |
Заголовок сообщения: | Re: Большие массивы |
Да, кстати, не заметил. А интересно, компилятор не должен был ругаться? |
Автор: | Илья Ермаков [ Понедельник, 11 Декабрь, 2006 11:20 ] |
Заголовок сообщения: | |
Компилятор, кстати, не ругается даже на объявление POINTER OF POINTER OF.... - и так строчек 15, т.е. 200-мерный массив, например. Более того, NEW, расписанный на стольких же строчках, отрабатывает. Естественно, выделить 2^200 байт невозможно, где-то идет переполнение, и выделяется совсем не то, что можно ожидать. |
Автор: | Сергей Губанов [ Понедельник, 11 Декабрь, 2006 11:25 ] |
Заголовок сообщения: | Re: Большие массивы |
Ivor писал(а): Да, кстати, не заметил. А интересно, компилятор не должен был ругаться?
Он ругается на превышение: 2^31 - 1 = 2147483647, а здесь чуть-чуть поменьше. |
Автор: | Pavel [ Понедельник, 11 Декабрь, 2006 14:21 ] |
Заголовок сообщения: | |
А как просчитать, какой объём пропустит система, если компилятор не ругается? |
Автор: | Сергей Губанов [ Понедельник, 11 Декабрь, 2006 15:43 ] |
Заголовок сообщения: | |
Pavel писал(а): А как просчитать, какой объём пропустит система, если компилятор не ругается?
Большие массивы надо размещать не на стеке, а в динамической памяти, т.е. через NEW. Узнать сколько памяти в компьютере под Windows можно так: Код: MODULE UtilsMemoryHost ["Kernel32"]; IMPORT SYSTEM; TYPE Boolean* = INTEGER; String* = INTEGER; (* address of s[0] *) MemoryStatusExDesc* = RECORD [noalign] thisStructureLength*, load*: INTEGER; totalPhys*, availPhys*, totalPageFile*, availPageFile*, totalVirtual*, availVirtual*, availExtendedVirtual*: LONGINT END; PROCEDURE GlobalMemoryStatusEx* (VAR r: MemoryStatusExDesc): Boolean; PROCEDURE GetDiskFreeSpaceExW* (directoryName: String; OUT freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfFreeBytes: LONGINT): Boolean; END UtilsMemoryHost. Код: MODULE UtilsMemory;
IMPORT Log := StdLog, UtilsMemoryHost; PROCEDURE Do*; (* (!)UtilsMemory.Do *) VAR desc: UtilsMemoryHost.MemoryStatusExDesc; BEGIN desc.thisStructureLength := SIZE(UtilsMemoryHost.MemoryStatusExDesc); IF UtilsMemoryHost.GlobalMemoryStatusEx(desc) # 0 THEN Log.String("load: "); Log.Int(desc.load); Log.Ln; Log.String("totalPhys: "); Log.Int(desc.totalPhys); Log.Ln; Log.String("availPhys: "); Log.Int(desc.availPhys); Log.Ln; Log.String("totalPageFile: "); Log.Int(desc.totalPageFile); Log.Ln; Log.String("availPageFile: "); Log.Int(desc.availPageFile); Log.Ln; Log.String("totalVirtual: "); Log.Int(desc.totalVirtual); Log.Ln; Log.String("availVirtual: "); Log.Int(desc.availVirtual); Log.Ln; Log.String("availExtendedVirtual: "); Log.Int(desc.availExtendedVirtual); Log.Ln ELSE Log.String("Error...") END; Log.Ln END Do; END UtilsMemory. availPhys - сколько физической памяти доступно, availVirtual - сколько доступно виртуальной. |
Автор: | Pavel [ Понедельник, 11 Декабрь, 2006 17:21 ] |
Заголовок сообщения: | |
Для 8-9 класса все слишком сложно. Будем методом "научного тыка" ![]() |
Автор: | Сергей Губанов [ Вторник, 12 Декабрь, 2006 11:36 ] |
Заголовок сообщения: | |
Pavel писал(а): Для 8-9 класса все слишком сложно.
Волков бояться - в лес не ходить. |
Автор: | Pavel [ Вторник, 12 Декабрь, 2006 17:19 ] |
Заголовок сообщения: | |
Согласен, но все равно для 8 класса сложно. ![]() |
Автор: | Info21 [ Четверг, 14 Декабрь, 2006 15:24 ] |
Заголовок сообщения: | Re: Большие массивы |
Pavel писал(а): Описываю массив
TYPE massiv=ARRAY 32767 OF SHORTINT; VAR a: ARRAY 32767 OF massiv; А зачем такой массив?? Страшно любопытно. ![]() |
Автор: | Pavel [ Четверг, 14 Декабрь, 2006 17:08 ] |
Заголовок сообщения: | |
Начал показывать описание массивов и их заполнение, объяснил, что размерность имеет свой предел и на этот предел ругается компилятор. Нашелся ученик, который описал такой массив |
Автор: | А.П. [ Суббота, 16 Декабрь, 2006 09:27 ] |
Заголовок сообщения: | |
Чтобы не морочить головы деткам некоторыми устаревшими представлениями и привычками, я бы посоветовал: 1) не гоняться за мифической экономией байтов памяти посредством использования типа SHORTINT вместо INTEGER. Зачем ловить байты, когда в сегодняшних компьютерах постоянно простаивают десятки свободных мегабайт? Количество проблем, которые возникают у начинающих при внедрении в программу SHORTINT, ничем не оправдано. 2) в качестве целого типа использовать практически всегда INTEGER. В 99,9% учебных задач его достаточно. Привычка тренировать деток в слежении за переполнением слишком короткого типа integer, на мой взгляд, должна уйти в прошлое. Укороченные и удлиненные типы следует начать использовать только после того, как уч-ся научатся азам алгоритмизации, т.е. не раньше 10 класса. Да и то лишь на задачах, имеющих хоть какую-то привязку к действительности. |
Автор: | Pavel [ Суббота, 16 Декабрь, 2006 15:18 ] |
Заголовок сообщения: | |
На областной олимпиаде по информатике была задача с следующими входными данными В первой строке находится одно число N (1 ≤ N ≤ 32767). Во второй строке находятся два числа X и Y (1 ≤ X, Y ≤ N) – координаты клетки, номер которой необходимо определить, если матрица заполнена по спирали. Ученик решал в "Лоб". Вот отсюда и вся «проблема» Мне стало интерестно, почему не ругается компилятор. ![]() |
Автор: | Info21 [ Понедельник, 18 Декабрь, 2006 13:51 ] |
Заголовок сообщения: | |
А.П. писал(а): Зачем ловить байты, когда в сегодняшних компьютерах постоянно простаивают десятки свободных мегабайт? Не согласен. У меня ни на одном компе не простаивают. А.П. писал(а): Количество проблем, которые возникают у начинающих при внедрении в программу SHORTINT, ничем не оправдано. Согласен. Экономия памяти -- проходит по разделу "оптимизация". Это "низкий" уровень, и для продвинутых программеров. В общем школьном курсе этому не место. А.П. писал(а): Привычка тренировать деток в слежении за переполнением слишком короткого типа integer, на мой взгляд, должна уйти в прошлое.
Деток -- да. Но любой серьезный вычислитель обязан о переполнениях постоянно думать. Но не в общем школьном, и не во вводном курсе. |
Автор: | Info21 [ Понедельник, 18 Декабрь, 2006 13:55 ] |
Заголовок сообщения: | |
Pavel писал(а): На областной олимпиаде по информатике была задача с следующими входными данными
В первой строке находится одно число N (1 ≤ N ≤ 32767)..... Будьте добры дать точную формулировку. Строки чего? Что такое "номер", который нужно определить? Похоже, стандартная задача на применение паттерна "геренатор", я бы вставил как упражнение себе в курс. |
Автор: | А.П. [ Вторник, 19 Декабрь, 2006 09:44 ] |
Заголовок сообщения: | |
info21 писал(а): А.П. писал(а): Зачем ловить байты, когда в сегодняшних компьютерах постоянно простаивают десятки свободных мегабайт? Не согласен. У меня ни на одном компе не простаивают. Я имел в виду в основном начинающую публику, а не крупных профи ![]() |
Автор: | Info21 [ Вторник, 19 Декабрь, 2006 20:49 ] |
Заголовок сообщения: | |
А.П. писал(а): Я имел в виду в основном начинающую публику, а не крупных профи
![]() Я тоже не имел в виду научные расчеты и т.п. -- просто текучку старого пользователя... |
Автор: | elvennight [ Вторник, 03 Декабрь, 2013 11:40 ] |
Заголовок сообщения: | Re: Большие массивы |
Подскажите, пожалуйста, можно ли как-нибудь обратиться напрямую к последнему элементу массива? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |