Форум «Всё о Паскале» _ Теоретические вопросы _ Присвоение записей
Автор: sheka 7.11.2010 5:10
Собственно вопрос - в названии темы. Пример:
type rec = record x, y: integer; end; var a, b: rec; begin a :=b; //a.x := b.x; //a.y := b.y; end.
Будет ли работать и в каких версиях? Просто препод доказывал, что так записи присваивать нельзя, а нужно только поочередно присваивать поля. PS: TP, FPC, Delphi - ест как миленький. ЗЗЫ: Или препод как обычно мороз сморозил ?
Автор: TarasBer 7.11.2010 5:47
Присваивать можно, если они одного типа. То есть совсем одного. А вот сравнивать - нельзя. И если
var a: rec; b: record x, y: integer; end;
то тоже нельзя - компилятор думает, что они разного типа.
Автор: volvo 7.11.2010 5:49
Цитата
Будет ли работать и в каких версиях?
В любых. Эта возможность закладывалась в язык изначально, еще Виртовский Паскаль умел присваивать записи.
Главное - чтобы выполнялись правила http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr4.shtml#35 (в частности, запись не должна содержать файловых переменных). Ну, и аккуратно работать с записями, содержащими поля-указатели, можно нарваться на ошибку. Для простых типов языка такой способ (присваивание записи целиком) гораздо предпочтительнее, чем по отдельным полям, ибо позволяет очень сильно разгрузить программу.
Автор: Lapp 7.11.2010 6:24
Конечно можно, в этом приличная такая часть сути языка. Учитывая, конечно, что сказано выше. Шек, а тебе не пришло в голову просто прогнать ту прогу, что ты привел, через компайлер и найти ответ на свой вопрос за 6 миллисекунд? Не забывый, что у тебя всегда есть этот способ под рукой: экспериментировать.
Цитата(sheka @ 7.11.2010 1:10)
препод как обычно мороз сморозил ?
Вот тут поподробнее.. Это серьезное обвинение. Если это правда - такого препа нужно срочно гнать в шею. Но я допускаю, что тут какое-то ндопонимание друг друга. Напиши, пожалуйста, точно, что он сказал.
Автор: sheka 7.11.2010 6:33
Цитата
Напиши, пожалуйста, точно, что он сказал.
"-В реализации Паскаля 95 года такого не было. Вернешься домой посмотришь. -Но... -Вернешься - посмотришь. -Да, конечно, но в 95й год я уж точно не вернусь"
Добавлено через 1 мин.
Цитата
Шек, а тебе не пришло в голову просто прогнать ту прогу, что ты привел, через компайлер и найти ответ на свой вопрос за 6 миллисекунд?
PS: TP, FPC, Delphi - ест как миленький. А на пару, как на зло, никто ноут не принес..
Автор: Lapp 7.11.2010 10:05
Цитата(sheka @ 7.11.2010 2:33)
"-В реализации Паскаля 95 года такого не было. ..."
Это только конец диалога. Вопрос стоял действмтельно о присвоении значений переменных типа запись?
Но если так - кошмар.. Мое мнение по этому поводу остается прежним (выше, выделено жирным). Когда у нас в школе был учитель математики, который.. мм.. не очень хорошо ее знал.. - мы собрались и пошли к завучу. Через неделю его поперли. Мне кажется, что в ВУЗе, да еще в нынешние времена (то было при советской власти) это более чем возможно. Найди несколько человек, которые тебя поддержат (но не двоечников)), и пойдите в деканат. Такое нельзя спускать с рук. Ссылаться на то, что НЕ ЗНАЛ в 95 году - и при этом учить студентов?? У меня слов не хватает..
Автор: sheka 11.11.2010 3:58
Потепление.
Понедельник: - Уточните, пожалуйста, вопрос на счет записей, ведь завтра все таки кр. Я проверил, вроде работает. - Конечно все возможно ... Все зависит от реализации ... А вот классический Паскаль ... строгий язык ... (вместо точек - куча каких-то объяснений типа "вода" продолжительностью 30-60 секунд) - Извините что прерываю, ТП где-то 90го года компилирует нормально. Или это не классический паскаль? - Классический, это тот, который Вирт сделал ... Как он это объяснял студентам ... Все как можно проще ... для обучения ... - Ну хорошо, а где я тогда могу встретить этот "классический паскаль"? - Оо. Ну он был еще на машинах, когда были еще такие машины (показал руками), как комнаты, где-то 65й -75й год... - (я обнаглел) Т.е. во всех реализациях после средины 70х это присутствует? - Ну это удобнее ... поэтому новые веения ... современные студенты законодатели моды ... - Т.е. я могу в кр так написать? - Но только с пометкой "в ТП реализовано".
Вторник: Контрольной не дал. Уже без агрессии сам начал говорить что записи присваивать можно ... студенты ... мода ... так им проще ...
Что-то этот рассказ напомнил мне как описывали рождение Полиграфа Полиграфовича Шарикова
Цитата
Эта возможность закладывалась в язык изначально, еще Виртовский Паскаль умел присваивать записи.
volvo, защищайтесь!
Автор: Lapp 11.11.2010 4:25
Цитата(sheka @ 10.11.2010 23:58)
Все зависит от реализации ... А вот классический Паскаль ... строгий язык ...
В таком присвоении содержится, как я уже говорил, львиная доля понятия переменной. При чем тут реализация? какая еще простота? СТРОГОСТЬ от этого абсолютно не страдает, а только выигрывает.. капец, приехали.. ГНАТЬ В ТРИ ШЕИ
я еще понял бы, если бы он признал ошибку и извинился бы - за это честь и хвала. Но если начинает юлить и оправбываться - ГНАТЬ В ТРИ ШЕИ.
Автор: sheka 11.11.2010 5:29
А можете это предоставить в виде цитаты из книги? (я не нашел ничего)
Автор: volvo 11.11.2010 5:55
Цитата
volvo, защищайтесь!
От кого защищаться? От твоего преподавателя, что-ли? Так пусть откроет книгу "К.Йенсен, Н.Вирт: Паскаль. Руководство для пользователя и описание языка" на страницах 22-23 и прочтет буквально следующее (цитирую)
Цитата("Глава 4.1 @ Оператор присваивания")
Оператор имеет такой вид: <переменная> := <выражение>
<cut>
Допустимо присваивание переменных любого типа, за исключением файлов. Однако переменная (или функция) и выражение должны быть идентичного типа: как исключение допускается использование переменной вещественного типа с выражением целого типа. Если речь идет об ограниченном типе, то правомочность присваивания определяется его базовым скалярным типом; см. разд. 5.2.
Или твой преподаватель лучше автора знает, что может язык Вирта, а что - нет? Так что пускай он теперь защищается...
Автор: sheka 11.11.2010 6:02
Вот блин.. А я 12ю страницу читал
Автор: Lapp 11.11.2010 6:46
Цитата(sheka @ 11.11.2010 1:29)
А можете это предоставить в виде цитаты из книги? (я не нашел ничего)
Я боюсь, что именно такую цитату: "записи можно присваивать" - ты и не найдешь никогда. Это же просто неотделимо от самой КОНЦЕПЦИИ ПЕРЕМЕННОЙ. А иначе половина ее смысла теряется. Формально же следует из общих принципов и определения а) оператора присваивания; б) совместимости типов.
Например, берем вот это описание стандарта http://www.standardpascal.org/iso7185.pdf. Читаем описание оператора присваивания:
Цитата
6.8 .2.2 Assignment-statements An assignment-statement shall attribute the value of the expression of the assignment-statement either to the variable denoted by the variable-access of the assignment-statement or to the activation result that is denoted by the function-identifier of the assignment-statement ; the value shall be assignment-compatible with the type possessed, respectively, by the variable or by the activation result. The function-block associated (see 6 .6.2) with the function-identifier of an assignment-statement shall contain the assignment-statement.
Главное я выделил, вот перевод: "значение должно быть совместимым по присваиванию". Заметим, что других ограничений не наложено. Про "совместимость по присваиванию" читаем ранее:
Цитата
6.4.6 Assignment-compatibility A value of type T2 shall be designated assignment-compatible with a type T1 if any of the following five statements is true: a) T1 and T2 are the same type ... ...
Ч., как говорится, и Т.Д.
ГНАТЬ В ШЕЮ
Добавлено через 1 мин. Блин, долго я писал, однако.. ))