Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Вниз

Почему компилятор не ругается?   Найти похожие ветки 

 
tmp   (2007-08-12 22:03) [0]


procedure TForm1.Button1Click(Sender: TObject);
var
 S, S1: string;
begin
 if lstrcmpi(PChar(S),PChar(S1),) = 0 then
   ShowMessage("is true");
end;


P.S Deplhi 7


 
TUser ©   (2007-08-12 22:35) [1]

Это глюк.


 
Anatoly Podgoretsky ©   (2007-08-12 22:37) [2]

> tmp  (12.08.2007 22:03:00)  [0]

Ну поскольку ты не говоришь как ругается, то ответ тебе не нужен.


 
tmp   (2007-08-12 22:51) [3]

> Ну поскольку ты не говоришь как ругается, то ответ тебе не нужен.

В том-то и дело, что вообще не ругается :)


 
TUser ©   (2007-08-12 22:51) [4]

Ругается молчанием


 
Юрий Зотов ©   (2007-08-12 22:52) [5]

> Почему компилятор не ругается?

Встречный вопрос - а почему> он должен ругаться?

С точки зрения компилятора - ЧТО здесь не так?


 
Anatoly Podgoretsky ©   (2007-08-12 22:57) [6]

Если в приведеном коде нет опечаток, то обязан ругаться, я визуально наблюдаю запятую, после которой нет параметра.


 
Lacmus ©   (2007-08-12 23:02) [7]

Описания parameterlist нет, так что можно считать, что так задумано, Delphi 2007 тоже самое.


 
turbouser ©   (2007-08-12 23:08) [8]

> Lacmus ©   (12.08.07 23:02) [7]
>
> Описания parameterlist нет,

Т.е?
см. windows.pas

function lstrcmpi(lpString1, lpString2: PChar): Integer; stdcall;

turbo delphi - тоже не ругается.
Однако, если добавить еще запятую - ругается.
Что-то тут не так.


 
Anatoly Podgoretsky ©   (2007-08-12 23:11) [9]

> turbouser  (12.08.2007 23:08:08)  [8]

А если без запятой, на что ругаться то?
Какую ругань автор ожидает?


 
Lacmus ©   (2007-08-12 23:14) [10]

>turbouser ©   (12.08.07 23:08) [8]

В описании языка Delphi нет описания синтаксиса parameterlist


 
turbouser ©   (2007-08-12 23:16) [11]

function test(a,b:integer):integer;
begin
 result:=a+b;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
S, S1: string;
begin
if test(1,2   ,   ) = 0 then //компилируется.
  ShowMessage("0");
end;

Интересно, в документации о таком что-то сказано? Я не нашел.
Про не обязательную точку с запятой что-то есть, а вот про это не знал :)


 
ferr ©   (2007-08-12 23:20) [12]

> Интересно, в документации о таком что-то сказано? Я не нашел.
> Про не обязательную точку с запятой что-то есть, а вот про
> это не знал :)

Это явно баг. Причём настолько банальный что удивительно.


 
Real ©   (2007-08-12 23:21) [13]


> В описании языка Delphi

Языка Delphi не существует в природе


 
turbouser ©   (2007-08-12 23:24) [14]


> Lacmus ©   (12.08.07 23:14) [10]

В каком смысле нет?
Most procedure and function headers include a parameter list. For example, in the header
function Power(X: Real; Y: Integer): Real;
the parameter list is (X: Real; Y: Integer).

A parameter list is a sequence of parameter declarations separated by semicolons and enclosed in parentheses. Each declaration is a comma-delimited series of parameter names, followed in most cases by a colon and a type identifier, and in some cases by the = symbol and a default value. Parameter names must be valid identifiers. Any declaration can be preceded by var, const, or out.


 
Lacmus ©   (2007-08-12 23:24) [15]

>Real ©   (12.08.07 23:21) [13]
>Языка Delphi не существует в природе

Это устаревшая информация


 
Anatoly Podgoretsky ©   (2007-08-12 23:26) [16]

> turbouser  (12.08.2007 23:16:11)  [11]

Может это выглядит и странно, но вполне логично, обязано передать параметр типа PChar оно это и делает, а кто сказал что данные константами не могут быть, тогда на том же основании не должно компилироваться Func("1", "2") где те-же параметры PChar


 
Lacmus ©   (2007-08-12 23:26) [17]

>turbouser ©   (12.08.07 23:24) [14]

Это описание объявления, а описание вызова ?


 
Anatoly Podgoretsky ©   (2007-08-12 23:27) [18]

> Real  (12.08.2007 23:21:13)  [13]

Проснись парниша, уже давно было постановление партии по этому поводу.


 
Lacmus ©   (2007-08-12 23:31) [19]

Самое забавное, что Delphi 2007 в редакторе выделяет такой вызов как ошибку (красная волнистая черта), а компилятор нет.


 
turbouser ©   (2007-08-12 23:34) [20]


> Lacmus ©   (12.08.07 23:26) [17]

см. хелп - Calling Procedures and Functions
When you call a procedure or function, program control passes from the point where the call is made to the body of the routine. You can make the call using the routine"s declared name (with or without qualifiers) or using a procedural variable that points to the routine. In either case, if the routine is declared with parameters, your call to it must pass parameters that correspond in order and type to the routine"s parameter list. The parameters you pass to a routine are called actual parameters, while the parameters in the routine"s declaration are called formal parameters.

When calling a routine, remember that

expressions used to pass typed const and value parameters must be assignment-compatible with the corresponding formal parameters.
expressions used to pass var and out parameters must be identically typed with the corresponding formal parameters, unless the formal parameters are untyped.
only assignable expressions can be used to pass var and out parameters.
if a routine"s formal parameters are untyped, numerals and true constants with numeric values cannot be used as actual parameters.
When you call a routine that uses default parameter values, all actual parameters following the first accepted default must also use the default values; calls of the form SomeFunction(,,X) are not legal.

You can omit parentheses when passing all and only the default parameters to a routine. For example, given the procedure
procedure DoSomething(X: Real = 1.0; I: Integer = 0; S: string = "");
the following calls are equivalent.
DoSomething();
         DoSomething;


 
vpbar ©   (2007-08-12 23:38) [21]

не эт не баг а фича. Оно не вызывает ошибок. Если дам должен быть параметр (например вызов функции с тремя параметрами) а его нет - то делфи ругнется. А если не должен быть параметр и его нет то чего ругаться.
Видимо список параметров в делфи задан такой формой
СПИСОКПАРАМЕТРОВ :={ПАРАМЕТР,}
где {} - ноль или несколько повторений
так проще


 
Lacmus ©   (2007-08-12 23:47) [22]

>turbouser ©   (12.08.07 23:34) [20]

Честно говоря, я даже про запятые в этом тексте не прочитал.


 
turbouser ©   (2007-08-13 00:01) [23]


> Lacmus ©   (12.08.07 23:47) [22]

В этом тексте сказано, что порядок и тип передаваемых
параметров должны совпадать с объявленными:
In either case, if the routine is declared with parameters, your call to it must pass parameters that correspond in order and type to the routine"s parameter list.
Перечисление параметров при передаче идет через запятую - парсер должен
по логике после каждой запятой ожидать очередной параметр. Если он игнорирует
пустоту после последней запятой и это не документировано - значит баг.


 
Lacmus ©   (2007-08-13 00:09) [24]

>turbouser ©   (13.08.07 00:01) [23]

См. vpbar ©   (12.08.07 23:38) [21] - вполне возможно,  
См. Lacmus ©   (12.08.07 23:31) [19] - в Borland также мнения не совпадают

В помощи нет строгого описания языка и ее явно пишут не разработчики компилятора.


 
ferr ©   (2007-08-13 00:18) [25]

> В помощи нет строгого описания языка и ее явно пишут не
> разработчики компилятора.

Гораздо больше интересной информации можно найти в грамматике ;-)

Обычно вызов процедур во всех языках определяется примерно одинаково, вот например это место в грамматике классического паскаля.


<procedure statement>
       ::= <identifier> <params>
        |  <identifier>

<params>
       ::= LPAREN <actual parameter list> RPAREN

<actual parameter list>
       ::= <actual parameter list> <comma> <actual parameter>
        |  <actual parameter>

<actual parameter>
       ::= <expression>
        |  <expression> COLON <expression>
        |  <expression> COLON <expression> COLON <expression>


Описание <expression> большое и сложное, поэтому его не привожу, но он естественно никак не может принимать пустое значение. Так что там такого ребята из борланда наворотили для меня большая загадка.


 
ferr ©   (2007-08-13 00:20) [26]

Это естественно не вызов, а описание процедуры, щас поищу вызов.


 
ferr ©   (2007-08-13 00:29) [27]

Всё же вначале я был прав.

Вот как задаётся описание процедуры:


<procedure declaration>
       ::= <procedure heading> <semicolon> <directive>
        |  <procedure heading> <semicolon> <procedure block>

<procedure heading>
       ::= <procedure identification>
        |  <procedure identification> <formal parameter list>

<formal parameter list>
       ::= LPAREN <formal parameter section list> RPAREN

<formal parameter section list>
       ::= <formal parameter section list> <semicolon> <formal parameter section>
        |  <formal parameter section>


P.S. Я это всё к тому что нормальные компиляторы не должны такого есть.


 
Юрий Зотов ©   (2007-08-13 00:35) [28]

Эва... а ведь только спросил...
:о)


 
Loginov Dmitry ©   (2007-08-13 07:53) [29]

Баг появился в Delphi 7. Раньше его не было.


 
Плохиш ©   (2007-08-13 12:51) [30]


> Баг появился в Delphi 7. Раньше его не было.

А параметры по-умолчанию в какой версии появились? Не отсюда ли ноги растут?


 
Loginov Dmitry ©   (2007-08-13 12:55) [31]


> А параметры по-умолчанию в какой версии появились?


Гораздо раньше, чем в D7


 
Lacmus ©   (2007-08-13 13:20) [32]

Whats new для Delphi 7

Compiler changes

The Delphi dcc32 compiler now supports three additional compiler warnings: Unsafe_Type, Unsafe_Code, and Unsafe_Cast.  These warnings are disabled by default, but can be enabled with the compiler directive {$WARN UNSAFE_CODE ON}, compiler command line switch (dcc32 -W+UNSAFE_CODE), and, in the IDE, on the Project|Options|Compiler Messages page.

Может с этим как-то связано



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.045 c
15-1186626194
Slider007
2007-08-09 06:23
2007.09.09
С днем рождения ! 9 августа 2007 четверг


2-1187553240
C0derr
2007-08-19 23:54
2007.09.09
Как сделать картинку в фрейме неподвижной при вертик. прокрутке?


2-1187218781
{RASkov}
2007-08-16 02:59
2007.09.09
Как принудительно обновить размер колонок в ListView?


15-1187082983
iXT
2007-08-14 13:16
2007.09.09
Free Server OS


15-1187253664
vajo
2007-08-16 12:41
2007.09.09
Intel чоппер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский