Отличие type и var, Отличие type и var |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Отличие type и var, Отличие type и var |
-notpron |
5.07.2011 18:44
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
Всем добрый вечер, не могу никак понять, в чем разница между type и var? Скорее всего - я немного не допонял саму функцию type.
И я совсем запутался в порядковых типах данных, для чего они нужны? Как(не теоритически) можно проверить функцию, например, ord(x)? Заранее спасибо) |
IUnknown |
5.07.2011 19:03
Сообщение
#2
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Type - это не функция. Это зарезервированное слово. Которое говорит компилятору, что начинается раздел описания типов. А var - это раздел описания переменных. Разница? Ну, скажем
type T = array[1 .. 10] of integer;это описывается тип T, который представляет из себя массив из 10 целых чисел. Но вот записать ничего в этот самый массив ты не сможешь, пока не опишешь переменную этого типа: var arr : T;Это уже описание переменной, теперь уже под a выделится нужное количество памяти, и с массивом можно будет работать... Под тип ничего не выделяется... Цитата И я совсем запутался в порядковых типах данных, для чего они нужны? Если есть - значит нужны... Порядковые - это значит, те, которые можно перечислить. Вот и нужны они для того, чтобы что-то перечислять, подсчитывать, индексировать... Тот же массив. Ты не можешь записать type T = array[1.2 .. 10.3] of integer;, тебе нужен порядковый тип в качестве индекса. И циклы For ты можешь использовать только с переменными порядковых типов, и никаких других. Цитата Как(не теоритически) можно проверить функцию, например, ord(x)? Что значит "проверить"? "Trust me, it's there..." © "День Независимости" |
-notpron |
5.07.2011 19:19
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
2 IUnknown
А можно не на примере массивов? Просто я до них пока не дошел. =( Что насчет проверить.Возьмем к примеру Код type week =(sun,mon,tue,wed,thu,fri,sat) Тогда для него будет верно что Код dec(sun)=sat Вот у меня и вопрос, как это проверить? Не теоретически, а на паскале. Сообщение отредактировано: -notpron - 5.07.2011 19:46 |
IUnknown |
5.07.2011 20:36
Сообщение
#4
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
не на примере массивов? Ну, напечатай первые 10 четных чисел... Как ты это будешь делать (считать, что напечатано именно 10, а не больше и не меньше, я имею в виду)? Вот видишь, тебе опять нужны порядковые (они же - перечислимые) типы... Только не надо говорить, что и до циклов ты тоже не дошел. Тогда до чего ж дошел?
Цитата Тогда для него будет верно что Неправда. Пользовательские типы не "закольцованы", то, что следующий после Fri будет Sat - верно, а вот значения после Sat или перед Sun - не определены, то есть, запрещено их получать... Нельзя написать Pred(Sun) или Succ(Sat)... |
-notpron |
5.07.2011 20:55
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
2 IUnknown
Не, до циклов я дошел) И вы не правы - перечисляемый тип данных является не пользовательским, а конструируемым. Можете проверять. Поэтому мое утверждение верно. Но так я и не понял практического применения. Да, можно воспользоваться, будь то дни недели или Nое количество чисел. Я не понимаю, как их можно "вытащить" оттуда. Ведь если заместо sat в Код dec(sun)=sat поставить переменную и потом вывести ее - так не получится.Тоже самое не получится(у меня не получилось) вывести просто 10 чисел. Сообщение отредактировано: -notpron - 5.07.2011 21:10 |
IUnknown |
5.07.2011 22:07
Сообщение
#6
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата И вы не правы - перечисляемый тип данных является не пользовательским, а конструируемым. Можете проверять. Ты это "можете проверять" кому-нибудь другому расскажи, ладно? Я эту "Филькину грамоту" уже лет 20 как наизусть знаю, не надо мне ничего проверять... Конструируемый - это тот, который строится на основании простого. На основании какого именно простого типа построен тип Week, не подскажешь?Цитата Поэтому мое утверждение верно. Какое утверждение? Что Dec(sun) = Sat? Это бред, а не утверждение. Знаешь, почему? По одной простой причине: Компилятору все равно, как там называются у тебя элементы перечисления... Для него это 0, 1, 2, ..., 255 (максимум). Заметь, от 0!!! Вот что получается:typeЧто выведется? А вот что: Ord(Sun) = 0. Хорошо, это напечатается. А теперь - следующий шаг: попробуем напечатать предыдущий элемент перечисления... И вот тут тебя поджидает большой облом... Ошибка 107, вот и все... Нет предыдущего элемента у Sun... Он есть только в одном-единственном случае: когда перечисление содержит ровно 255 элементов, тогда Pred(первый_элемент) = последний_элемент, но это скорее побочный эффект, поэтому пользоваться этим не стоит... Хотя writeln( week(ord(sun) + 1) ); прекрасно печатает mon (я пользуюсь FPC, и тебе советую, в Турбо Паскале будет ошибка, там такое не позволяется)... Цитата Тоже самое не получится(у меня не получилось) вывести просто 10 чисел. Да что ты? Теория программирования понесла тяжелую утрату :var i : integer; // Integer - это по-твоему тоже НЕпорядковый тип? Ну-ну...Если у тебя что-то не получается - это не значит, что оно невозможно... |
-notpron |
5.07.2011 22:59
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
Не надо ругаться, спокойнее. Просто аргументированный спор(хотя какой спор я могу вам предложить не знаю массивы )
Конструированный тип данных это тот тип, который конструируется(извините за тафтологию) самим программистом. Разве не так? И потом dec(min_element)= max_element не? возьмем тип данных Код type sixteen = 0..15; И вместе ненавистного вам dec возьмем inc, который действует по аналогичной системе. Inc(x) возвращает значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+1). Правильно? 15 это 1111 в двоичной системе. 1111 + 1 получается 1 0 0 0 0. Начальную единицу откидываем и получается inc(15)=0. Разве нет? Я не спорю - ошибаться могу, 100%. Спасибо большое за программу для использование порядковых типв данных, правда, очень пригодилось. И насчет FPC спасибо, но я использую school pack, ибо на mac я ничего не нашел ;) И насчет 10 чисел - вывести не через цикл а через перечисляемый тип данных. Не надо агрессии, правда. Я бы не хотел этого) Сообщение отредактировано: -notpron - 6.07.2011 5:00 |
Lapp |
6.07.2011 5:09
Сообщение
#8
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Я извиняюсь за встрятие..
Не надо ругаться, спокойнее. Просто аргументированный спор(хотя какой спор я могу вам предложить не знаю массивы ) -notpron, а кто ругался и где? Покажи мне то место, плз. А манера говорить у каждого своя - ты волен не слушать.. И учти, если ты будешь нести чушь, приговаривая при этом "я прав", - ты будешь получать ответы в таком именно духе. Само по себе нести чушь - пожалуйста, на то и форум. Но не говори "вы не правы" тем, кто тысячи таких как ты научил уже..Цитата Конструированный тип данных это тот тип, который конструируется(извините за тафтологию) самим программистом. Разве не так? Нет, не так, и IUnknown тебе уже говорил это. У конструируемого есть синоним (или перевод на русский, если хочешь) - "составной". То есть он может состоять минимум из двух квантов определения типов. Но раз ты не знаешь массивы (и, наверное, записи), я затрудняюсь привести пример. А вообще - избегай "свободной трактовки терминов на основе здравого смысла и опыта", действуй только на основе определений.Цитата И потом dec(min_element)= max_element не? Нет.Цитата возьмем тип данных Ошибаешься, 100% Код type sixteen = 0..15; И вместе ненавистного вам dec возьмем inc, который действует по аналогичной системе. Inc(x) возвращает значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+1). Правильно? 15 это 1111 в двоичной системе. 1111 + 1 получается 1 0 0 0 0. Начальную единицу откидываем и получается inc(15)=0. Разве нет? Я не спорю - ошибаться могу, 100%. Твоя ошибка, по-видимому, есть результат трех факторов. 1. Неудачно выбран пример - я имею в иду вот это: Week = (sun, mon, tue, wed, thu, fri, sat);(кстати, ставь, пожалуйста, ПРАВИЛЬНЫЕ теги; прочти Правила форума и правила этого раздела - там все подробно написано) Почему неудачно? Потому что дни недели действительно зациклены, причем идеально (т.е. лучше, чем, скажем, числа в месяцах). Но это есть всего лишь свойство дней недели, а не общая математическая закономерность. Например, в некоторых карточных играх, шестерка бьет туза, а в некотороых - нет, не бьет. 2. Ты знаешь, как устроено машинное представление чисел (и это хорошо), но, видимо, не до конца (или кое-что не учитываешь). Если при сложении двух байт (или беззнаковых целых) происходит переполнение, действительно в результате будет число с отрезанным верхним разрядом. Но! Но при этом будет установлен признак переполнения. Иными словами, обрезание при переполнении есть вынужденная мера (поскольку любая реальная разрядная сетка конечна), но есть и средство исправить ситуацию. 3. У тебя в опциях компилятора выключена проверка выхода за пределы диапазона (range check). Вот это - очень плохо! Рекомендую тебе зайти в опции и установить ее range check в дефолт. И убирай его ТОЛЬКО после полной отладки программы, и ЕСЛИ собираешься отдать программу в эксплуатацию. Иначе ты хлебнешь горя.. )) Вот тебе пример программы, которая либо будет работать неправильно, либо выдаст три (ну, не одновременно)) ошибки выхода за диапазон. {$R+} // замени + на -, и прога пройдет - но результат будет неверный Зацикленные целые множества (группы "по модулю") весьма часто бывают нужны. Встроенной поддержки их в языке Pascal нет. Если у тебя в программе нужна такая функциональность (те же дни недели, например), ты должен сам явным образом определить сложение/вычитание (при этом очень удобно использовать перезагрузку операторов). Цитата насчет FPC спасибо, но я использую school pack, ибо на mac я ничего не нашел ;) Да? странно.. А про что тогда строчка: "Mac OS X and several crosscompilers" на странице скачивания FreePascal? Я сам, правда, эту ссылку не пробовал..Добавлено через 12 мин. Вдогонку еще один простенький примерчик использования типов. Допустим, твоя программа производит сложные расчеты. Ты использовал тип single для представления чисел в ней. Но потом (когда прога на много килобайт кода была уже написана) понял, что в некоторых случаях все же лучше использовать double (для большей точности). И ты начинаешь ползать по всей программе, состоящей из нескольких модулей, и менять там все single на double.. Причем, некоторые переменные могут не относиться к собственно расчетам, и их можно (и нужно) оставить single. И ты кусаешь локти.. А если бы у тебя было в самом начале: type- а потом везде (где надо) стояло бы tReal, то тебе надо было бы сделать всего одно изменение: type -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
IUnknown |
6.07.2011 10:37
Сообщение
#9
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Зацикленные целые множества (группы "по модулю") весьма часто бывают нужны. Встроенной поддержки их в языке Pascal нет. Кстати, встроенной поддержки циклических перечислений, определенных пользователем, насколько я помню, нет нигде, хотя очень многие просят. В некоторых языках есть встроенные модульные типы (обладающие необходимым функционалом). Но пользоваться вариантом "описать модульный тип, а потом Sun, Mon, ... Sat - как константы этого типа" не очень удобно, проще переопределить функции Pred и Succ:{$mode objfpc}, а когда в FPC наконец допилят дженерики хотя бы до того уровня, что есть сейчас в Дельфи - можно будет написать две шаблонные функции Pred и Succ и передавать в них параметры любых перечислимых типов. |
-notpron |
6.07.2011 11:18
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
2 Lapp
Я понимаю что манера говорить у всех своя, но я же не использую сленг имиджбордов, правильно? Поэтому везде есть рамки. Но не в этом суть. Цитата И учти, если ты будешь нести чушь, приговаривая при этом "я прав", - ты будешь получать ответы в таком именно духе. Ну почему чушь, я всего лишь ошибался. Это тоже самое(пусть пример будет глупым) если спросить у мальчика, который учится в третьем классе, "какое самое маленько число?", то он ответит "0". А если спросить это же у 8 класса, то они ответят "-бесконечность". И разве можно будет винить 3 класс? Как я прочитал в литературе - так и сказал здесь. Поймите меня тоже, кому вы поверите сначала, книге или какому то парню с форума? Теперь я понял что ошибался, без вопросов. Цитата (кстати, ставь, пожалуйста, ПРАВИЛЬНЫЕ теги; прочти Правила форума и правила этого раздела - там все подробно написано) Чем вас не устраивает тег [cоde]? По-моему его можно использовать. Цитата Да? странно.. А про что тогда строчка: "Mac OS X and several crosscompilers" на странице скачивания FreePascal? Я сам, правда, эту ссылку не пробовал.. После установки она не появляется в программах, я гуглил, там надо черех xcode пилить, а это геморно. Про последний пример - я его не понял, уж извините) |
-TarasBer- |
6.07.2011 14:52
Сообщение
#11
|
Гость |
это тролль, не реагируйте
|
-notpron |
6.07.2011 14:56
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
Не надо оффтопить, есть что сказать по теме - скажи.
|
-TarasBer- |
6.07.2011 15:07
Сообщение
#13
|
Гость |
канонично...
|
-notpron |
6.07.2011 16:13
Сообщение
#14
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
Ну и сразу дурацкий вопрос - а как копипастить в turbo pascal? Тоесть допустим отсюда код в программу?
|
sheka |
6.07.2011 17:27
Сообщение
#15
|
Я. Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: 11 |
.pas - текстовый документ.
Создавай новые темы в новых темах |
-notpron |
6.07.2011 17:41
Сообщение
#16
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
Ну про этот способ мне известно, но все равно спасибо)
|
Lapp |
6.07.2011 22:50
Сообщение
#17
|
|||
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Чем вас не устраивает тег [cоde]? По-моему его можно использовать. Еще раз, теперь уже как админ тебе говорю:
Цитата Про последний пример - я его не понял, уж извините) Уточни, что ты имел в виду: мой пример или IUnknown. И точно указывай, в каком месте затык.Добавлено через 3 мин. Ну про этот способ мне известно, но все равно спасибо) Другого способа нет и быть не может. TP - это досовская прога, она ничего не знает про виндусовый буфер. Все равно что сказать: объясните, как заливать бензин в лошадь..-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
|||
-notpron |
7.07.2011 18:52
Сообщение
#18
|
Новичок Группа: Пользователи Сообщений: 12 Пол: Мужской Репутация: 0 |
2 Lapp
2. Все тексты фрагментов программ должны помещаться в теги [cоde] ... [/cоde] или [cоde=pas] ... [/cоde]. Нет? Не, я ваш пример немного не въехал Спасибо за объяснение по поводу копипаста) Сообщение отредактировано: -notpron - 7.07.2011 18:52 |
Lapp |
7.07.2011 22:21
Сообщение
#19
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
2. Все тексты фрагментов программ должны помещаться в теги [cоde] ... [/cоde] или [cоde=pas] ... [/cоde]. Ты цитируешь п.2 правил раздела. Я уже понял, что у тебя трудности с его пониманием, поэтому просил посмотреть п.5 Правил Форума (ссылка вверху страницы). Кроме того, посмотри все остальные пункты.Нет? Цитата Не, я ваш пример немного не въехал Что именно в нем неясно?-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 30.09.2024 4:52 |