![]() |
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 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот например, что написано у Епанешниковых(Программирование в среде Turbo Pascal 7.0):
10.3.2. Параметры переменные Цитата При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра должна использоваться переменная идентичного типа(см п 9.1). Смотрим пункт 9.1: Цитата Идентичность типов Идентичность типов требуется от формальных параметров процедур и функций и соответствующих им фактических параметров во время вызова. Два типа T1 и T2 идентичны в следующих случаях: 1) T1 и T2 - один и тот же идентификатор типа(например, Integer, Real и т.д.); 2) один тип объявляется эквивалентным другому. Пример type T1 = Boolean; T2 = T1; T3 = Boolean; Все типы T1, T2, T3 и Boolean - идентичные типы. type M1 = array[1..5] of Integer; M2 = array[1..5] of Integer; Типы M1 и M2 - не идентичные типы. Однако V1 и V2 - переменные идентичных типов: var V1, V2 : array[1..5] of Integer; Получается, что типы данных формальных и фактических VAR-параметров просто должны совпадать, но это не так! И Turbo Pascal и Delphi нормально компилируют Type1(VarType2) (здесь VAR-параметр имеет тип Type1, а переменная VarType2 - соответственно Type2) если Type1 является подмножеством Type2. ![]() |
compiler |
![]()
Сообщение
#3
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
Получается, что типы данных формальных и фактических VAR-параметров просто должны совпадать, но это не так! И Turbo Pascal и Delphi нормально компилируют тебе же написали Цитата То, что оно компилируется в Турбо Паскале - еще не значит, что оно ДОЛЖНО там компилироваться а еще многие ошибки вообще не отлавливаются во время компиляции.. Сообщение отредактировано: compiler - 14.07.2007 16:05 -------------------- Спасибо!
Удачи! |
Neznaika |
![]()
Сообщение
#4
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
тебе же написали а еще многие ошибки вообще не отлавливаются во время компиляции.. Я так не думаю. По-моему использование в качестве фактического VAR-параметра переменной совместимого (расширенного) типа - это не ошибка, а вполне нормальное явление. Не могу привести никаких ссылок, но я где-то встречал примеры такого способа передачи параметров. Повторяю: И Turbo Pascal и Delphi нормально компилируют Type1(VarType2) (здесь VAR-параметр имеет тип Type1, а переменная VarType2 - соответственно Type2) если Type1 является подмножеством Type2. Компилятор пишут одни люди, документацию другие. Например в моей версии Delphi в помощи на синтаксических диаграммах для CASE указано, что перед ELSE ";"(точку с запятой) ставить нельзя. На самом же деле её можно и ставить и не ставить!!! Проблема не в компиляторе, а в ДОКУМЕНТАЦИИ! |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 23:20 |