Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2012, 21:24   #1
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию Работа с ограниченным типом

Здравствуйте, уважаемые профессионалы.
Раньше всегда использовал стандартные типы: Byte, Real, Integer. Однако недавно прочел статью об эффективном программировании. Автор советовал ограничивать диапазон переменной для уменьшения объема памяти программы и повышения быстродействия – так ли это?
В итоге решил перейти на ограниченный тип. Однако есть одна трудность: я присваиваю значения переменной, и порой это значение выходит за рамки диапазона типа переменной. В этом случае мне необходимо получить новое значение по формуле:
Код:
type
  Month = 1..12;
var
  New: Month;
begin
// Январь.
New:=13; // New:=1;
// Декабрь.
New:=0;  // New:=12;
end;
Написал функцию:
Код:
type
  Month = 1..12;
var
  New: Month;

function GetValidValue(M: Integer): Month;
begin
//
if M>High(Month) then M:=M-High(Month);
//
if M<Low(Month)  then M:=ABS(ABS(M)-High(Month));
//
Result:=M;
end;
Вопрос №2: есть ли возможность автоматически перегрузить значение, подобно Byte(-4) = 252 ?

P.S. Программирую в Delphi, возможно на Pascal немного иначе
Alexan-Dwer вне форума Ответить с цитированием
Старый 13.01.2012, 22:10   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Знаю только что можно сэкономить на типе string , он = 256 байтов 1 - длина строки остальные хранят что-то НО если ты ввел 'asd' то будет 256 байт можно выйграть за сщет "мусора" (байты которые хранят что-то не нужное, например 'asd' -> 1 байт = 3, 2 = 'a' , 3 = 's', 4 = 'd', а остальное "мусор"). Нужно просто ограничить размер строчки s : string[5], то есть займет 6 байт, строка хранит 5 символов.


А вот еще что-то нашел http://borlpasc.narod.ru/docym/prac/ograni.htm

Последний раз редактировалось Poma][a; 13.01.2012 в 22:12.
Poma][a вне форума Ответить с цитированием
Старый 15.01.2012, 15:27   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Так понимаю, что не так понят автор ...
Интересно, а вот этот код:
Код:
type
  Month = 1..12;
var
  New: Month;
begin
// Январь.
New:=13; // New:=1;
// Декабрь.
New:=0;  // New:=12;
end;
компилируется нормально? У меня не стоят Delphi.
Month - это интервальная переменная и компилятор должен ругнуться на несоответствие типа. А может отключен контроль?

И как понимать ускорение, когда вставляется дополнительная п/п для контроля значений переменной?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 15.01.2012, 18:12   #4
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Poma][a, ViktorR спасибо за сообщение

Poma][a:
Цитата:
Знаю только что можно сэкономить на типе string...
String я не использую, предпочитаю PChar.
Цитата:
А вот еще что-то нашел...
Я читал такие статьи, но там лишь основные данные. Мне нужна более углубленная информация

ViktorR:
Цитата:
Так понимаю, что не так понят автор ...
...И как понимать ускорение, когда вставляется дополнительная п/п для контроля значений переменной?
Возможно. Вопрос о скорости и быстродействии не основной в данной теме.

Больше интересует вторая часть: как можно перегрузить интервальную переменную – пример я уже приводил [Byte(-4) = 252].
Цитата:
...компилятор должен ругнуться на несоответствие типа.
Да, напрямую присвоить нельзя. Но если написать Byte(13), то значение переменной станет равно 13, хотя оно не входит в диапазон 1..12.

Последний раз редактировалось Alexan-Dwer; 15.01.2012 в 18:13. Причина: Изменил оформление
Alexan-Dwer вне форума Ответить с цитированием
Старый 05.02.2012, 14:24   #5
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
Лампочка

После дискуссии с более опытными программистами получил следующие ответы:
Цитата:
...с Byte похоже происходит сдвиг на аппаратном уровне
...со своим типом такой возможности нет, кроме как пользоваться дополнительной функцией
Соответственно, вопрос решен!

P.S. Извините за повторное сообщение в теме, я не могу редактировать свой предыдущий пост.
Прошу модераторов объединить ответы в одно сообщение.
Alexan-Dwer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с комбинированным типом Stuff Паскаль, Turbo Pascal, PascalABC.NET 1 02.06.2010 23:17
Работа с типом днных STRING Nika2010 Помощь студентам 10 16.02.2010 07:18
Работа с типом данных запись в Pascal JayDe23 Помощь студентам 3 18.06.2009 18:08
работа под ограниченным профилем kos1nus Помощь студентам 6 14.12.2008 13:04
Работа с типом Record TheNovice Помощь студентам 4 28.02.2007 17:52