![]() |
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 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo:
Я не хочу ругаться, я разобраться хочу. Просто ошибка в этом месте у меня несколько раз появлялась. Если TP не устраивает, тогда на Delphi(Win32): Код procedure Proc1( var I : Integer; var W : Word ); begin end; procedure Proc2( var I : SmallInt; var W : Word ); begin end; var I : Integer; { 4 bit } W : Word; { 2 bit } SI : SmallInt; { 2 bit } D : DWord; { 4 bit } begin Proc1(I,W); Proc1(D,Word(D)); { Proc1(D,D) - не работает! } Proc2(SI,W); Proc2(SmallInt(W),Word(SI)); end. Например есть число, которое будет обрабатываться как 32-разрядное, а инициализируется оно например вызовом некоторой процедуры как 16-разрядное. ИЛИ числа со знаком и без знака, но их SizeOf(Type1) = SizeOf(Type2). Эквивалентность и равенство - это одно и то же или нет? Если по-вашему выходит, что ЭКВИВАЛЕНТНОСТЬ = РАВЕНСТВО, то как Delphi пропускает Proc1(D,Word(D)); ??? Я понимаю, что здесь в процедуру передаётся адрес ячейки памяти, названной D(на этапе объявления переменных компилятор отвёл под неё 4 байта, записал в своих таблицах, что её тип DWord, ещё что-то там сделал). Ещё здесь(при генерации вызова процедуры) компилятор проверяет типы фактических параметров. Но при этом никакого ПРЕОБРАЗОВАНИЯ/ПРИВЕДЕНИЯ ТИПОВ не происходит, компилятор просто генерирует push VarAddr call Proc или mov reg, VarAddr call Proc Тоже самое он сгенерирует для переменной правильного типа(как у VAR-параметра). Сама процедура просто тупо скопирует значение результата в ячейку по переданному ей адресу. Мне непонятно, почему нельзя Proc1(D,D), а нужно обязательно Proc1(D,Word(D))??? Сообщение отредактировано: Neznaika - 14.07.2007 15:27 |
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 22:15 |