Авторизироваться
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Модератор форума: ADMIN, Nextik  
Библиотека процедур!
12.09.2010 в 19:56 Сообщение #31
Iced
Новичок
Пользователи
Сообщений: 13
Награды: 0
Репутация: 7
Offline
Не работает, мож я чета не так понял.
inc(a) это тоже самое что и a:=a+1, пародия на a++
13.09.2010 в 14:32 Сообщение #32
Edelon
Удаленные
так и есть. есть в борланде (с подменой по макросу) вариант inc(n,k); где n что увеличиваем а k на сколько увеличивает за один вызов.
собственно с inc-ом ещ можно и пережить... но фак не возвращаемости из процедур печалит... так же сложно без указателей и переобьявления типов... пример
Code
var  
  cnt    :integer;
begin
  cnt:=-320;
  writeln(cnt);
  writeln(word(cnt));
end.

для тех кто таким еще не пользоывался поясняю: переменная cnt была обьявлена как знаковое слово (1полярность+15занчение=16бит) в первом writeln мы обратилисть по типу. во втором мы попросили отобразить его как беззнаковое слово (16значение=16бит). этот приём применяется не только к write, сам лично не раз применял чтоб хранить и обрабатывать pointer как longint
13.09.2010 в 16:49 Сообщение #33
fnc12
Удаленные
Edelon, я не понял практическую значимость твоего метода.
13.09.2010 в 17:47 Сообщение #34
12121
Программист
Проверенные
Сообщений: 357
Награды: 4
Репутация: 290
Offline
но фак не возвращаемости из процедур печалит...
Это как понять ? !
1 значение можно вернуть. Если надо больше то используем глобальные переменные/массивы.
тип integer 32 битный а не 16 битный. Неужели мало ?
Указатели только создают кучу проблем. Без них вполне можно обойтись. Попробуй убедить меня в обратном.
15.09.2010 в 16:14 Сообщение #35
Edelon
Удаленные
Quote (fnc12)
Edelon, я не понял практическую значимость твоего метода.

в частности пример из борланда: всем известно что в борланде функция не может вернуть тип запись. К примеру координаты X Y (integer 16bit) одной переменной. Но если их вложить в longint (32bit) и обратится как к записи:

Code
type coord = record
   x,y   :integer;
   end;

var
   arr   :array[0..10] of coord;
   cnt   :integer;

function some_act(somein:integer):longint;
var temp:coord;
begin
   temt.x:=somein+10;
   temt.y:=trunc(somein/10);
   some_act:=longint(temp);{ возвращаем ответ в "нужном" типе}
end;

BEGIN
   for cnt:=0 to 10 do
   longint(arr[cnt]):=some_act(cnt); {обращаемся к записи в выходном типе функции и наполняем массив}

   for cnt:=0 to 10 do
   putpixel(arr[cnt].x,arr[cnt].y,cnt); {отрисовываем}
END.

собственно идея в том что можно вернуть несколько параметров при выходе из одной функции (как известно прыжки в программе требуют не мало времени) без использования var в декларации. если 32 разряда не хватает можно объявить string[сколько надо] каким то типом и обращаться к нему. Главное чтоб в памяти типы были соразмерны (весили одинаково), иначе последствия непредсказуемы (затрешь соседнюю ячейку или не дописав оставишь шум).

Именно за счёт этого финта я смог в борланд паскале реализовать динамический массив: есть возможность зарезервировать память определённого объёма и получить указатель на её начало. но вот адресоваться к произвольному элементу, не получается. Тип pointer не допускает арифметических операций над собой, и весит 32 бита. а вот тип longint имеет арифметику и весит столько же. В общем обрабатываем указатель как лонгинт и получаем ссылку на произвольный элемент выделенной памяти.

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

Сообщение отредактировал Edelon - Среда, 15.09.2010, 16:58
15.09.2010 в 17:09 Сообщение #36
Edelon
Удаленные
Quote (12121)
Указатели только создают кучу проблем. Без них вполне можно обойтись. Попробуй убедить меня в обратном.

то что создают кучу проблем спору нет. но как по мне это не великая цена за динамичность кода. к примеру как ты предложишь ввести в программу новый объект без указателя?
а метод с указателем вполне понятный и привычный: запросить объём памяти который тебе нужен а вответ получить ссылку на неё.
15.09.2010 в 17:49 Сообщение #37
Edelon
Удаленные
Quote (12121)
но фак не возвращаемости из процедур печалит...

это была опечатка :\ фак=факт
Quote (12121)
тип integer 32 битный а не 16 битный.

в мидлет паскале он таки 32битный. а я в примере приводил код борланд паскаля с учетом его спецификации.
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Поиск: