OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 17 Ноябрь, 2019 18:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Большие массивы
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 09:16 

Зарегистрирован: Суббота, 09 Декабрь, 2006 08:56
Сообщения: 35
Откуда: Беларусь
Доброе время суток.
Рад всех приветствовать.
Работаю с BlackBox с середины августа этого года. Учащиеся начали изучать с сентября.
При решении задач с большими массивами (8-9 класс) возникли проблемы:
Описываю массив
TYPE massiv=ARRAY 32767 OF SHORTINT;
VAR a: ARRAY 32767 OF massiv;
и далее, например заполнение по спирали.
И система при компилировании ошибок не выдает, но при выполнении выбрасывает из системы или пишет "steck overflow ..." при меньших размерах массива программа работает идеально.
Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Большие массивы
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 10:34 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
А полностью процедуру можно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Большие массивы
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 11:13 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Pavel писал(а):
TYPE massiv=ARRAY 32767 OF SHORTINT;
VAR a: ARRAY 32767 OF massiv;

"steck overflow ..."


32767 * 32767 * 2 = 2'147'352'578

Если размер переменной равен двум гигабайтам, то ничего удивительного в этом нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Большие массивы
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 11:14 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Да, кстати, не заметил. А интересно, компилятор не должен был ругаться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 11:20 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Компилятор, кстати, не ругается даже на объявление
POINTER OF POINTER OF.... - и так строчек 15, т.е. 200-мерный массив, например. Более того, NEW, расписанный на стольких же строчках, отрабатывает. Естественно, выделить 2^200 байт невозможно, где-то идет переполнение, и выделяется совсем не то, что можно ожидать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Большие массивы
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 11:25 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Ivor писал(а):
Да, кстати, не заметил. А интересно, компилятор не должен был ругаться?


Он ругается на превышение: 2^31 - 1 = 2147483647, а здесь чуть-чуть поменьше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 14:21 

Зарегистрирован: Суббота, 09 Декабрь, 2006 08:56
Сообщения: 35
Откуда: Беларусь
А как просчитать, какой объём пропустит система, если компилятор не ругается?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 15:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
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 - сколько доступно виртуальной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 11 Декабрь, 2006 17:21 

Зарегистрирован: Суббота, 09 Декабрь, 2006 08:56
Сообщения: 35
Откуда: Беларусь
Для 8-9 класса все слишком сложно. Будем методом "научного тыка" :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 12 Декабрь, 2006 11:36 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Pavel писал(а):
Для 8-9 класса все слишком сложно.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 12 Декабрь, 2006 17:19 

Зарегистрирован: Суббота, 09 Декабрь, 2006 08:56
Сообщения: 35
Откуда: Беларусь
Согласен, но все равно для 8 класса сложно. :cry:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Большие массивы
СообщениеДобавлено: Четверг, 14 Декабрь, 2006 15:24 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Pavel писал(а):
Описываю массив
TYPE massiv=ARRAY 32767 OF SHORTINT;
VAR a: ARRAY 32767 OF massiv;


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Декабрь, 2006 17:08 

Зарегистрирован: Суббота, 09 Декабрь, 2006 08:56
Сообщения: 35
Откуда: Беларусь
Начал показывать описание массивов и их заполнение, объяснил, что размерность имеет свой предел и на этот предел ругается компилятор.
Нашелся ученик, который описал такой массив


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 16 Декабрь, 2006 09:27 

Зарегистрирован: Пятница, 02 Декабрь, 2005 14:35
Сообщения: 190
Откуда: Россия, Томск
Чтобы не морочить головы деткам некоторыми устаревшими представлениями и привычками, я бы посоветовал:
1) не гоняться за мифической экономией байтов памяти посредством использования типа SHORTINT вместо INTEGER. Зачем ловить байты, когда в сегодняшних компьютерах постоянно простаивают десятки свободных мегабайт? Количество проблем, которые возникают у начинающих при внедрении в программу SHORTINT, ничем не оправдано.
2) в качестве целого типа использовать практически всегда INTEGER. В 99,9% учебных задач его достаточно. Привычка тренировать деток в слежении за переполнением слишком короткого типа integer, на мой взгляд, должна уйти в прошлое.
Укороченные и удлиненные типы следует начать использовать только после того, как уч-ся научатся азам алгоритмизации, т.е. не раньше 10 класса. Да и то лишь на задачах, имеющих хоть какую-то привязку к действительности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 16 Декабрь, 2006 15:18 

Зарегистрирован: Суббота, 09 Декабрь, 2006 08:56
Сообщения: 35
Откуда: Беларусь
На областной олимпиаде по информатике была задача с следующими входными данными
В первой строке находится одно число N (1 ≤ N ≤ 32767).
Во второй строке находятся два числа X и Y (1 ≤ X, Y ≤ N) – координаты клетки, номер которой необходимо определить, если матрица заполнена по спирали.
Ученик решал в "Лоб". Вот отсюда и вся «проблема»
Мне стало интерестно, почему не ругается компилятор. :?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 18 Декабрь, 2006 13:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
А.П. писал(а):
Зачем ловить байты, когда в сегодняшних компьютерах постоянно простаивают десятки свободных мегабайт?


Не согласен. У меня ни на одном компе не простаивают.

А.П. писал(а):
Количество проблем, которые возникают у начинающих при внедрении в программу SHORTINT, ничем не оправдано.


Согласен. Экономия памяти -- проходит по разделу "оптимизация". Это "низкий" уровень, и для продвинутых программеров.
В общем школьном курсе этому не место.

А.П. писал(а):
Привычка тренировать деток в слежении за переполнением слишком короткого типа integer, на мой взгляд, должна уйти в прошлое.

Деток -- да.
Но любой серьезный вычислитель обязан о переполнениях постоянно думать.

Но не в общем школьном, и не во вводном курсе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 18 Декабрь, 2006 13:55 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Pavel писал(а):
На областной олимпиаде по информатике была задача с следующими входными данными
В первой строке находится одно число N (1 ≤ N ≤ 32767).....


Будьте добры дать точную формулировку. Строки чего? Что такое "номер", который нужно определить?

Похоже, стандартная задача на применение паттерна "геренатор", я бы вставил как упражнение себе в курс.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 19 Декабрь, 2006 09:44 

Зарегистрирован: Пятница, 02 Декабрь, 2005 14:35
Сообщения: 190
Откуда: Россия, Томск
info21 писал(а):
А.П. писал(а):
Зачем ловить байты, когда в сегодняшних компьютерах постоянно простаивают десятки свободных мегабайт?


Не согласен. У меня ни на одном компе не простаивают.



Я имел в виду в основном начинающую публику, а не крупных профи :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 19 Декабрь, 2006 20:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
А.П. писал(а):
Я имел в виду в основном начинающую публику, а не крупных профи :)


Я тоже не имел в виду научные расчеты и т.п. -- просто текучку старого пользователя...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Большие массивы
СообщениеДобавлено: Вторник, 03 Декабрь, 2013 11:40 

Зарегистрирован: Суббота, 05 Март, 2011 05:10
Сообщения: 10
Подскажите, пожалуйста, можно ли как-нибудь обратиться напрямую к последнему элементу массива?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB