1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
| Neznaika |
13.07.2007 12:44
Сообщение
#1
|
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
Извиняюсь за возможное нарушение правил, но решил поместить пример программы,
чтобы сразу было понятно что к чему. ПРОГРАММА: Код 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 |
14.07.2007 15:49
Сообщение
#2
|
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
Вот например, что написано у Епанешниковых(Программирование в среде 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 |
14.07.2007 16:05
Сообщение
#3
|
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Получается, что типы данных формальных и фактических VAR-параметров просто должны совпадать, но это не так! И Turbo Pascal и Delphi нормально компилируют тебе же написали Цитата То, что оно компилируется в Турбо Паскале - еще не значит, что оно ДОЛЖНО там компилироваться а еще многие ошибки вообще не отлавливаются во время компиляции.. Сообщение отредактировано: compiler - 14.07.2007 16:05 -------------------- Спасибо!
Удачи! |
| Neznaika |
14.07.2007 16:52
Сообщение
#4
|
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
тебе же написали а еще многие ошибки вообще не отлавливаются во время компиляции.. Я так не думаю. По-моему использование в качестве фактического VAR-параметра переменной совместимого (расширенного) типа - это не ошибка, а вполне нормальное явление. Не могу привести никаких ссылок, но я где-то встречал примеры такого способа передачи параметров. Повторяю: И Turbo Pascal и Delphi нормально компилируют Type1(VarType2) (здесь VAR-параметр имеет тип Type1, а переменная VarType2 - соответственно Type2) если Type1 является подмножеством Type2. Компилятор пишут одни люди, документацию другие. Например в моей версии Delphi в помощи на синтаксических диаграммах для CASE указано, что перед ELSE ";"(точку с запятой) ставить нельзя. На самом же деле её можно и ставить и не ставить!!! Проблема не в компиляторе, а в ДОКУМЕНТАЦИИ! |
Neznaika Несоответсвие типов VAR-параметров подпрограмм(error 26). 13.07.2007 12:44
compiler procedure p( const s:string );
begin
writeLn(s);
... 13.07.2007 13:25
volvo Ничего никуда не превращается. Как всегда было Err... 13.07.2007 13:43
Neznaika compiler:
Не смешно, мой пример СИНТАКСИЧЕСКИ КОРР... 13.07.2007 16:14
volvo Если ты не понял того, что написано в предыдущем п... 13.07.2007 16:31
Neznaika volvo:
Я не хочу ругаться, я разобраться хочу.
Про... 13.07.2007 18:02
volvo Дельфи? Сорри, только не Дельфи:
Что я делаю не... 14.07.2007 16:58
Neznaika
unit Unit1;
interface
uses
Windows, Messages,... 14.07.2007 17:07
мисс_граффити Естественно.
А где в этом примере несоответствие м... 14.07.2007 19:57
volvo Разговор был про Var-параметры... Попробуй добавит... 14.07.2007 21:07
Neznaika Тьфу, чёрт. Теперь вроде всё "правильно... 14.07.2007 23:22
Neznaika BDS2006(компилятор Delphi для Win32):
...
var
W... 18.07.2007 16:42
hardcase
Уважаемые эксперты, объясните пожалуйста
1) Что... 8.08.2007 21:16
Neznaika
hardcase, спасибо.
Но всё равно, тёмное дело. В... 11.08.2007 16:36
volvo Neznaika, во-первых, будет ли твоя программа компи... 11.08.2007 17:00
Neznaika Да, с {$T+} Proc(Word((@B)^),DWord((@B)^)); н... 11.08.2007 17:41
hardcase Есть такое понятие в программировании - безопасный... 11.08.2007 18:23![]() ![]() |
|
Текстовая версия | 8.12.2025 17:27 |