Форум: "Прочее";
Текущий архив: 2011.04.17;
Скачать: [xml.tar.bz2];
ВнизНаткнулся на интересное поведение в 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 := falseif (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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.005 c