![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
Neznaika |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
Извиняюсь за возможное нарушение правил, но решил поместить пример программы,
чтобы сразу было понятно что к чему. ПРОГРАММА: Код program VarStr; uses Dos; procedure Proc( var Dir : DirStr; var Name : NameStr; var Ext : ExtStr ); begin end; procedure Proc2( var B : Byte; var W : Word; var L : LongInt ); begin end; procedure Proc3( var I : Integer; var W : Word ); begin end; procedure Proc21( B : Byte; W : Word; L : LongInt ); begin end; var SD, SN, SE : String; SDir : DirStr; SName : NameStr; SExt : ExtStr; B : Byte; W : Word; L : LongInt; I : Integer; begin (*Proc(SD,SN,SE); { НЕЛЬЗЯ! Ошибка 26: Type mismatch(несовпадение типов). }*) Proc(SDir,SName,SExt); { Всё в порядке! } (*Proc2(B,B{Error 26!},B);*) (*Proc2(W{Error 26!},W,W);*) (*Proc2(L{Error 26!},L,L);*) Proc2(B,W,L); { Всё в порядке! } (*Proc3(W{Error 26!},W);*) (*Proc3(W{Error 26!},I);*) (*Proc3(I,I{Error 26!});*) Proc3(I,W); { Всё в порядке! } Proc3(Integer(W),Word(I)); { Всё в порядке! } Proc21(B,W,L); { Всё в порядке! } Proc21(L,B,W); { Всё в порядке! } Proc21(W,L,B) { Всё в порядке! } end. И сам ВОПРОС(недеюсь он теоретический(имеет отношение к синтаксису, семантике и т.д. и т.п)): Почему типы фактических параметров переменных, задаваемых при вызове подпрограммы, должны СОВПАДАТЬ(быть РАВНЫМИ) соответствующим формальным VAR-параметрам. Почему здесь ошибка 26(Type mismatch) - НЕСООТВЕТСТВИЕ ТИПОВ превращается в ошибку НЕСОВПАДЕНИЕ ТИПОВ. Пожалуйста, если кто-нибудь знает, объясните. |
![]() ![]() |
Neznaika |
![]()
Сообщение
#2
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
BDS2006(компилятор Delphi для Win32):
Delphi 2.0:
Уважаемые эксперты, объясните пожалуйста 1) Что означает ошибка "Constant object cannot be passed as var parameter" в случае BDS2006 и в случае Delphi2 ??? 2) Если типы VAR-параметров должны быть "идентичны", почему тогда компилятор пропускает Proc(Word((@B)^),DWord((@B)^)); ??? 3) Дайте пожалуйста определение эквивалентности(как написал volvo) типов формальных и фактических VAR-параметров. Спасибо заранее. |
hardcase |
![]()
Сообщение
#3
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
Уважаемые эксперты, объясните пожалуйста 1) Что означает ошибка "Constant object cannot be passed as var parameter" в случае BDS2006 и в случае Delphi2 ??? Приведение типа приводит к созданию временной локальной копии объекта, которая трактуется копилятором как константа приводимого типа. 2) Если типы VAR-параметров должны быть "идентичны", почему тогда компилятор пропускает Proc(Word((@B)^),DWord((@B)^)); ??? Дело в том, что по умолчанию операция получения адреса @ "теряет" тип объекта. Разыменовывая указатель операцией ^ мы получаем некий объект, который не имеет типа; для того чтобы с ним работать компилятору требуется явно указать тип адресованного объекта - в этом случае операция приведения типа не создает локальной копии, ибо выполняется на этапе компиляции. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Neznaika |
![]()
Сообщение
#4
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Приведение типа приводит к созданию временной локальной копии объекта, которая трактуется копилятором как константа приводимого типа. hardcase, спасибо. Но всё равно, тёмное дело. Во второй версии Delphi вызов с Type1(VariableOfType2) производит только проверку совместимости(как я написал раньше вместо W можно указать Word(DW), но не Word(B)). В Delphi 6 (судя по картинке volvo) и в BDS2006 компилятор похоже действительно пытается создать локальную копию объекта. Цитата Дело в том, что по умолчанию операция получения адреса @ "теряет" тип объекта. Разыменовывая указатель операцией ^ мы получаем некий объект, который не имеет типа; для того чтобы с ним работать компилятору требуется явно указать тип адресованного объекта - в этом случае операция приведения типа не создает локальной копии, ибо выполняется на этапе компиляции. Мне кажется, что оба действия - и Type1(Type2Variable) и Type1((@Type2Variable)^) - выполняются на этапе компиляции. Но почему в первом случае создаётся локальная копия(для VAR-параметров), по какому синтаксическому правилу? Можно где-нибудь об этом узнать? |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 16:24 |