Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.04.17;
Скачать: CL | DM;

Вниз

Наткнулся на интересное поведение в D2010   Найти похожие ветки 

 
Ega23 ©   (2010-12-27 15:27) [0]


type
 TMyType1 = class (TObject)
 strict private type
   TMyEnum = (meA, meB, meC);
 end;

 TMyType2 = class (TObject)
 strict private type
   TMyEnum = (meA, meB, meC);
 end;


[Error] Unit2.pas(17): E2004 Identifier redeclared: "meA"


 
12 ©   (2010-12-27 15:30) [1]


> Unit2.pas(_17_):

:)


 
Ega23 ©   (2010-12-27 15:32) [2]

Н-да, 5 баллов!
И всё-таки...


 
Kerk ©   (2010-12-27 15:37) [3]

В QC пиши, тут-то какой смысл мусолить.


 
tesseract ©   (2010-12-27 15:41) [4]


> [Error] Unit2.pas(17): E2004 Identifier redeclared: "meA"


Вроде правильно пишет. Надо тип объявить. А то у тебя реально два объекта с одинаковыми идентификаторами.


 
Ega23 ©   (2010-12-27 15:46) [5]


> Вроде правильно пишет. Надо тип объявить. А то у тебя реально
> два объекта с одинаковыми идентификаторами.


Дык они же private, да ещё и strict
Выходит, что для Enum-а это всё равно в unit-scope находится.
Странно.


 
oxffff ©   (2010-12-27 15:48) [6]


> Ega23 ©   (27.12.10 15:46) [5]
>
> > Вроде правильно пишет. Надо тип объявить. А то у тебя
> реально
> > два объекта с одинаковыми идентификаторами.
>
>
> Дык они же private, да ещё и strict
> Выходит, что для Enum-а это всё равно в unit-scope находится.
>
> Странно.


Приветствую.
IMHO QC.


 
Ega23 ©   (2010-12-27 15:52) [7]


> Приветствую.

Взаимно.

> IMHO QC.

Ну вот хотелось бы сначала обсудить, дабы на QC дураком не выглядеть.


 
tesseract ©   (2010-12-27 15:52) [8]


> Дык они же private, да ещё и strict


Имена-то у них не Private и не Strict. Объяви перечисляемый тип и используй как поле. Или компилятор должен на ходу выяснять в момент присваивания какой из перечисляемых типов с одинаковым именем имеется в виду?


 
Kerk ©   (2010-12-27 15:53) [9]


> tesseract ©   (27.12.10 15:52) [8]
>
> Или компилятор должен на ходу выяснять в момент присваивания какой из
> перечисляемых типов с одинаковым именем имеется в виду?

Чего ему выяснять, если у них scope не пересекается?


 
tesseract ©   (2010-12-27 15:58) [10]


> Чего ему выяснять, если у них scope не пересекается?


Выходит область имен у них все-же пересекается. Компилятор назначает каждому перечисляемому типу набор внутренних ID.  При смене ID собственно он и ругается. Баг это или не баг в данном режиме не понятно и чего-бы общий тип не задать тож неясно.


 
Kerk ©   (2010-12-27 16:00) [11]


> tesseract ©   (27.12.10 15:58) [10]
>
> > Чего ему выяснять, если у них scope не пересекается?
>
> Выходит область имен у них все-же пересекается.

Выходит, пересекается. В этом и баг :)


 
oxffff ©   (2010-12-27 16:01) [12]


> Ega23 ©   (27.12.10 15:52) [7]
>
> > Приветствую.
>
> Взаимно.
>
> > IMHO QC.
>
> Ну вот хотелось бы сначала обсудить, дабы на QC дураком
> не выглядеть.


А ты прав.

Довод за QC

У компилятора есть возможность выяснить в текущей области видимости активные определения и их лексемы.

Довод против QC

У компилятора нет возможности выяснить что имел программист под meA.
Либо необъявленный идентификатор, либо действительную активную лексему. То есть что имел ввиду программист TMyType1.meA или TMyType2.meA? Это трудноуловимый момент.


 
tesseract ©   (2010-12-27 16:06) [13]


> Выходит, пересекается. В этом и баг :)


Объявление перечисляемых типов не входят в определение strict и private - это не имена процедур и полей. Они собственно и скрываются и видны не будут. А вот объявление типа будет неявно все равно вынесено - и получается что получается. ID будут пересекаться.


 
oxffff ©   (2010-12-27 16:12) [14]


> tesseract ©   (27.12.10 16:06) [13]
>
> > Выходит, пересекается. В этом и баг :)
>
>
> Объявление перечисляемых типов не входят в определение strict
> и private - это не имена процедур и полей.


Почему не входят. Определение типа включает в себя область допустимых значений констант-лексем, которые действительны в указанной области и которые лишены смысла вне его. IMHO.
То есть встретив выражение MeA можно однозначно установить вид, тип этого выражения.


 
Ega23 ©   (2010-12-27 16:20) [15]


>  и чего-бы общий тип не задать тож неясно.

Ситуация простая. Пишу серию тестов, под каждый - свой парсер, ну, будем считать, HTML-документа.
В конечном итоге, по результатам тестов, останется один парсер.
Соответственно, надо было сделать некое множество HTML-тэгов, встретив которые парсер будет что-то там делать. Выносить это дело "наверх" не хочется, ибо по-идее, это сугубо внутренняя логика парсера.
Ну и получилось. Один парсер, в нём перечислимый тип. Другой парсер, в нём такой же перечислимый тип, только чуть-чуть отличается по набору. У обоих есть TagType ttNone (служебный).
Ну вот и наткнулся на такое поведение.


 
Ega23 ©   (2010-12-27 16:26) [16]


> Почему не входят. Определение типа включает в себя область
> допустимых значений констант-лексем, которые действительны
> в указанной области и которые лишены смысла вне его. IMHO.
>
> То есть встретив выражение MeA можно однозначно установить
> вид, тип этого выражения.


Проверил.

 TMyType1 = class
//  strict private type
//    TMyEnum = (meA, meB, meC);
 strict private const
   c_MyConst = 1;
 end;

 TMyType2 = class
//  strict private type
//    TMyEnum = (meA, meB, meC);
 strict private const
   c_MyConst = 1;
 end;



Всё отлично, всё на ура скомпилялось.


 
tesseract ©   (2010-12-27 16:30) [17]


> Всё отлично, всё на ура скомпилялось.


Дык и должно. Ты не определяешь же константы meA. Попробуй их объявить как приватные константы и запихнуть в Enum. Так должно прокатить при использовании в приватах класса.


 
Ega23 ©   (2010-12-27 16:37) [18]


> Дык и должно. Ты не определяешь же константы meA. Попробуй
> их объявить как приватные константы и запихнуть в Enum.
> Так должно прокатить при использовании в приватах класса.


ээээ...
Я тебя не понял.
Код давай. :)


 
oxffff ©   (2010-12-27 16:42) [19]


> Ega23 ©   (27.12.10 16:26) [16]
>
> > Почему не входят. Определение типа включает в себя область
>
> > допустимых значений констант-лексем, которые действительны
>
> > в указанной области и которые лишены смысла вне его. IMHO.
>
> >
> > То есть встретив выражение MeA можно однозначно установить
>
> > вид, тип этого выражения.
>
>
> Проверил.
>
>  TMyType1 = class
> //  strict private type
> //    TMyEnum = (meA, meB, meC);
>  strict private const
>    c_MyConst = 1;
>  end;
>
>  TMyType2 = class
> //  strict private type
> //    TMyEnum = (meA, meB, meC);
>  strict private const
>    c_MyConst = 1;
>  end;
>
>
>
> Всё отлично, всё на ура скомпилялось.


Все зависит от реализации компилятора. и аналогия не совсем прямая.
Поскольку в данном случае имя является косвенным обращением к значению. В отличии от прямого обращения к значению meA.


 
tesseract ©   (2010-12-27 17:18) [20]

Дуим ду :

  strict private const
   meA = 1;
   meB = 2;
   meC = 3;
 strict private type
TMyEnum = (meA, meB, meC);
   

Это эмпирика, но может прокатить.


 
Alkid ©   (2010-12-27 19:43) [21]

Вопрос на засыпку: а что написано про это в спецификации языка?
;)


 
Alx2 ©   (2010-12-27 21:08) [22]

Ого, как много воды утекло. И это такой Delphi теперь? Аж strict private? Эдакая "частная персональная страница" Еще пяток лет забью на предменую область и совсем все забуду. Зато, наверняка будут монстры типа
strict public privated semiconst
 value : metaExtended extends complex fraction over TCalendar;
:)


 
Ega23 ©   (2010-12-28 00:13) [23]


>  И это такой Delphi теперь?


Давно уже.


 
Юрий Зотов ©   (2010-12-28 00:53) [24]

> У компилятора нет возможности выяснить что имел программист под meA.

А самое интересное то, что через некоторое время программист, глядя на свой же код, даже и сам не сразу поймет где у него какой meA. Вот и спрашивается - а на фига же искать приключения на собственную... голову?


 
Макс Черных   (2010-12-28 02:01) [25]

Юрий Зотов ©   (28.12.10 00:53) [24]
> Вот и спрашивается - а на фига же искать приключения на
> собственную... голову?

Зачем на свою. :) Мну вот как-то замутил некий реорганизационный момент в куче мале всяких юнитов. Ну и объеденил 3 Олегиных модуля в один. И тут-же вот от этих одинаковых констант перечисляемых компилятор и вошел в ступор. Спрашиваю - это чего и для зачем? Ответ - ХЗ, бум посмотреть. :)

Так что неважно, понимает это компилятор или не понимает, но понятность кода от такого дублирования страдает очень сильно. Вывод - так делать не стоит, ИМХО.


 
Германн ©   (2010-12-28 03:22) [26]


> Макс Черных   (28.12.10 02:01) [25]
>
> Юрий Зотов ©   (28.12.10 00:53) [24]
> > Вот и спрашивается - а на фига же искать приключения на
> > собственную... голову?
>
> Зачем на свою. :) Мну вот как-то замутил некий реорганизационный
> момент в куче мале всяких юнитов. Ну и объеденил 3 Олегиных
> модуля в один. И тут-же вот от этих одинаковых констант
> перечисляемых компилятор и вошел в ступор. Спрашиваю - это
> чего и для зачем? Ответ - ХЗ, бум посмотреть. :)

Оригинальная у вас контора. :)
Будь я помоложе...

Не, ну. Должность технического директора у вас не занята?
Точнее она занята и я даже знаю кем. :)


 
Ega23 ©   (2010-12-28 07:57) [27]


>  Ну и объеденил 3 Олегиных модуля в один. И тут-же вот от
> этих одинаковых констант перечисляемых компилятор и вошел
> в ступор.


Я ж тогда тебя спрашивал: объединять в один модуль или разнести по "один компонент - один юнит". Ты сказал: разнеси, если чё - соберём в один.


 
Юрий Зотов ©   (2010-12-28 10:10) [28]

Даже и в случае "один компонент - один юнит" все общие для них типы и константы лучше вынести в отдельный модуль.


 
Ega23 ©   (2010-12-28 10:16) [29]


> Даже и в случае "один компонент - один юнит" все общие для
> них типы и константы лучше вынести в отдельный модуль.


Они не общие были. Они были разные, но у некоторых совпадали названия. Поскольку сидели в разных юнитах (поначалу) - было пофиг. Когда Макс начал их в один переносить - вот тут конфликт и произошёл.


 
Юрий Зотов ©   (2010-12-28 10:51) [30]


> вот тут конфликт и произошёл.

И очень хорошо, что он произошел. Иначе последствия могли бы быть очень тяжелыми.


 
oxffff ©   (2010-12-28 10:55) [31]


> Когда Макс начал их в один переносить - вот тут конфликт
> и произошёл.


:)


 
DiamondShark ©   (2010-12-28 11:00) [32]

Клиническая картина ясна: разработчики потеряли чувство языка. Из стройного, логичного и компактного, но при этом мощного языка дельфи превратился в чулан Плюшкина, в который понатаскано рухляди по едиственному принципу: "А шоб было".


 
Dimka Maslov ©   (2010-12-28 22:58) [33]


> DiamondShark ©   (28.12.10 11:00) [32]


Никто ведь и не заставляет пользоваться всей этой шнягой. Пока.


 
Макс Черных   (2010-12-29 00:49) [34]


>  разработчики потеряли чувство языка.

Да ну конечно, во всем виноват Путин и ко.
Вот для примера пара кусков кода, аффтор пишет (типа профессионально) более 10 лет:

 if ((SR<>"0")and(Mont="0")and(Obor="0")and(Proch="0"))or
    ((SR="0")and(Mont<>"0")and(Obor="0")and(Proch="0"))or ((SR="0")and(Mont="0")and(Obor<>"0")and(Proch="0")) or ((SR="0")and(Mont="0")and(Obor="0")and(Proch<>"0"))or ((SR="0")and(Mont="0")and(Obor="0")and(Proch="0")) then MultStatRow := false


  if (FormNum=1) or (FormNum=2) or (FormNum=14) or (FormNum=4) or (FormNum=22) or (FormNum=24) or (FormNum=17) or (FormNum=18) or (FormNum=13) or (FormNum=21) or (FormNum=20) or (FormNum=26) or (FormNum=23) or (FormNum=25) then

И виноваты в этом тихом ужасе, вестимо, разработчики, и Б.Гейтс, бо он во всем виноват. И Чубайс, который во всем остальном виноват (С ЕБН).


 
cwl ©   (2010-12-29 01:03) [35]

> аффтор пишет (типа профессионально) более 10 лет:
много он, интересно, такого за 10 лет написал? %>


 
Макс Черных   (2010-12-29 01:11) [36]


> много он, интересно, такого за 10 лет написал?

Дофига. :) Еще один пример (из многих :( ), синтаксис и комментарии гуру сохранены:

function ChangeSeparatorInStr(str: string): string;
var posit, i, l: integer;
   tmp, s: string;
begin
 posit := pos(",", str);
 tmp := str;
 delete(tmp, posit, 1);
 l := length(str);
 if (pos("=", trim(str))=1) then //вроде работает, но...
   for i:=0 to l-1 do
    begin
     s := copy(str, i, 1);
     if s="," then
     begin
       tmp := copy(str, i-1, 1);
       if (tmp<>" ") and ((tmp="0") or (tmp="1") or (tmp="2") or (tmp="3") or (tmp="4") or
         (tmp="5") or (tmp="6") or (tmp="7") or (tmp="8") or (tmp="9")) then
         begin
           tmp := copy(str, i+1, 1);
           if (tmp<>" ") and ((tmp="0") or (tmp="1") or (tmp="2") or (tmp="3") or (tmp="4") or
             (tmp="5") or (tmp="6") or (tmp="7") or (tmp="8") or (tmp="9")) then
           str[i] := ".";
         end;
     end;
    end;
 Result := str;
end;


 
Германн ©   (2010-12-29 03:23) [37]


> Макс Черных   (29.12.10 00:49) [34]
>
>
> >  разработчики потеряли чувство языка.
>


> Макс Черных   (29.12.10 01:11) [36]
>
>
> > много он, интересно, такого за 10 лет написал?
>
> Дофига. :) Еще один пример (из многих :( ), синтаксис и
> комментарии гуру сохранены:

А просто навести порядок в своем собственном коллективе, разработать общие нормы для кода что помешало?
Отсутствие нормального технического директора, ИМХО".

Хороший ГенДир - это главное. Без него вообще ничего не будет. Но и без хорошего "технического директора" не обойтись фирме, которая предлагает свои разработки.


 
TUser ©   (2010-12-29 04:37) [38]

> Макс Черных   (29.12.10 01:11) [36]

Олег не мог такого написать, явно с тырнета скопипастил, халявщик.


 
Ega23 ©   (2010-12-29 08:06) [39]


> Олег не мог такого написать

Не-не-не, я так не умею, это не я.
Когда я только на работу пришёл, меня парни напугали кодом этого товарища. Тот на порядок круче приведённого был.


 
TUser ©   (2010-12-29 08:09) [40]

IncDay - тоже его произведение?



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

Текущий архив: 2011.04.17;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.011 c
2-1295328781
начинающий2
2011-01-18 08:33
2011.04.17
Два потока и общая процедура


15-1293597688
Curse
2010-12-29 07:41
2011.04.17
Профсоюз IT


15-1293820670
Правильный$Вася
2010-12-31 21:37
2011.04.17
а есть ли SMART на DVD-приводах?


15-1293744604
Юрий
2010-12-31 00:30
2011.04.17
С днем рождения ! 31 декабря 2010 пятница


15-1293565837
TUser
2010-12-28 22:50
2011.04.17
Почему эбонит электризуется при натерании об шерсть?