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 класса все слишком сложно. Будем методом "научного тыка" :lol:

Автор:  Сергей Губанов [ Вторник, 12 Декабрь, 2006 11:36 ]
Заголовок сообщения: 

Pavel писал(а):
Для 8-9 класса все слишком сложно.


Волков бояться - в лес не ходить.

Автор:  Pavel [ Вторник, 12 Декабрь, 2006 17:19 ]
Заголовок сообщения: 

Согласен, но все равно для 8 класса сложно. :cry:

Автор:  Info21 [ Четверг, 14 Декабрь, 2006 15:24 ]
Заголовок сообщения:  Re: Большие массивы

Pavel писал(а):
Описываю массив
TYPE massiv=ARRAY 32767 OF SHORTINT;
VAR a: ARRAY 32767 OF massiv;


А зачем такой массив??
Страшно любопытно.
:shock:

Автор:  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/