Конференция "Журнал" » APC: Ошибка в коде (?) или снова про MultiByteToWideChar
 
  • guav © (12.11.06 22:34) [0]
    Вроде нашел ошибку в коде АРС, не уверен правда, что ошибка.
    См. мои комментарии:

    // если строка содержит многобайтовые символы

       SetLength(WS, Length(S)); // этой длины ей много будет

       if MultiByteToWideChar(cp_utf8, 0, PChar(S), -1, PWideChar(WS), Length(WS) + 1) = 0 then begin
       // тут проблем не будет, только в конце WS будет мусор

          Result := S;
          Exit;
       end;

       SetLength(Result, Length(WS)); // результирующая длина больше, чем требуется на длину мусора
       // но эта операция правильна, ansi - один байт на символ, тут просто у WS неправильная длина.

       if WideCharToMultiByte(cp_1251, 0, PWideChar(WS), Length(WS) + 1,   PChar(Result), Length(WS) + 1, nil, nil) = 0 then begin
       // тут пытаемся сконвертировать и строку и мусор. если получится, то длина будет больше чем нужно
       // нуль-терминатор на месте, но длина не правильная

          Result := S;
          Exit;
       end;

  • Anatoly Podgoretsky © (12.11.06 23:08) [1]
    > guav  (12.11.2006 22:34:00)  [0]

    Так ты до конца смотри, последнея строка  Result := PChar(Result);
    Результат точная строка, до первого нулевого символа.

    Я конечно мог бы сделать с получением длины необходимой строки, но это двойной вызов функции и в конце то же самое Result := S

    Зачем? Результат одинаковый.

    Не вижу проблемы. Мусор учтен, он убирается последней строкой, для UTF-8 этот метод подходит, поскольку результат всегда меньше по длине. Строка может содержать любой мусор в конце, важна только левая часть до первого ограничителя, что и убирается через функцию PChar
    Параметр -1 обеспечивает этот самый ноль.

    Давай свои доводы.
  • Anatoly Podgoretsky © (12.11.06 23:10) [2]
    > guav  (12.11.2006 22:34:00)  [0]

    Там где Result := S; Exit; - там присваивается входное значение в случае внутренней ошибки в работе функции MultiByteToWideChar и WideCharToMultiByte
  • Anatoly Podgoretsky © (12.11.06 23:23) [3]
    > guav  (12.11.2006 22:34:00)  [0]

    Я так понимаю, что ты уже скачал код и анализируешь?
    Как общее впечателение?
  • guav © (12.11.06 23:38) [4]
    > [1] Anatoly Podgoretsky ©   (12.11.06 23:08)

    Не заметил слона :-( ветку можно удалять. а можно и не удалять.

    более лучшим было бы решение не с урезанием Result а с урезанием WS (таким же образом, или по результату MultiByteToWideChar)

    PS: Я успешно поставил компонент. однако, сам проект окрывается сложнее [D7, Ics6]
  • Anatoly Podgoretsky © (12.11.06 23:50) [5]
    > guav  (12.11.2006 23:38:04)  [4]

    Да зачем удалять, если потребуется, то сюда же и можно писать.
  • Anatoly Podgoretsky © (12.11.06 23:54) [6]
    > guav  (12.11.2006 23:38:04)  [4]

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

    Насчет установки - я предупреждал, три компонента, правда один все равно полезен - это TNT, а вот два остальных возможно никогда не будут использоваться, хотя если надо будет сделать что то на сторону с полностью встроеный БД, то и абсолют пригодится, а вот судьба ICS более печально, правильнее пользоваться, тем что идет с Дельфи, просто мне Инди не подошло, только потратил неделю, но плохой опыт - тоже опыт.
  • guav © (12.11.06 23:55) [7]
    > [3] Anatoly Podgoretsky ©   (12.11.06 23:23)
    > Как общее впечателение?

    Трудно пока сказать, мне сложно в это сразу вникнуть, особенно когда среда отвергает проект (пытаюсь открывать в Д7). Могу разве что попридираться к ReadSettings/SaveSettings или к MultiByteToWideChar :-)
  • Anatoly Podgoretsky © (12.11.06 23:56) [8]
    > guav  (12.11.2006 23:38:04)  [4]

    Упс, я писал, что нужен ICS5, я не знаю как себя это будет вести на бете версии 6.
  • guav © (12.11.06 23:57) [9]
    > [6] Anatoly Podgoretsky ©   (12.11.06 23:54)
    > я специально отказался от выделения точного места, функция
    > это позволяет, в других проектах у меня это используется,
    > просто здесь более эффективен этот метод, не надо считать,
    > само присвоит ровно столько сколько нужно.

    не понял.
  • guav © (12.11.06 23:59) [10]
    > [8] Anatoly Podgoretsky ©   (12.11.06 23:56)

    поведение не важно, мне лишь бы открыть в среде.
    Модули переименовал и всё ок вроде. Но наверно таки установлю ICS5
  • Anatoly Podgoretsky © (13.11.06 00:09) [11]
    > guav  (12.11.2006 23:55:07)  [7]

    Ну к этому можно придраться, хотя это самые не существенные куски, можно по разному реализовывать, тем более что я к одному замечанию, по поводу ReadSettings прислушался, сделал по другому, хотя и старый вариант тоже нормальный был.
  • Anatoly Podgoretsky © (13.11.06 00:10) [12]
    > guav  (12.11.2006 23:57:09)  [9]

    У функции можно спросить, сколько байт требуется для результата, затем выделить это место и снова вызвать уже для исполнения.
  • Anatoly Podgoretsky © (13.11.06 00:10) [13]
    > guav  (12.11.2006 23:59:10)  [10]

    И учти, что я делал на Д2006 может и тут что-то вылезет.
  • guav © (13.11.06 00:18) [14]
    > [12] Anatoly Podgoretsky ©   (13.11.06 00:10)

    Понял. Долгий, но зато надёжный способ.

    Про ReadSettings/SaveSettings:
    Ну не нравится мне когда вышел с максимизированным окном, после чего окно не уменьшается при восстанавливании wsNormal. да и повторение кода в каждой форме уже может быть поводом для придирки :-)


    > [13] Anatoly Podgoretsky ©   (13.11.06 00:10)
    > И учти, что я делал на Д2006 может и тут что-то вылезет.

    Кроме лишних свойств в ДФМ и кодировки модулей в УТФ-7 - ничего, вроде.
  • Anatoly Podgoretsky © (13.11.06 00:23) [15]
    > guav  (13.11.2006 0:18:14)  [14]

    UTF это не дань моде, а насущная необходимость, при том это делаю не я, а среда. В отличии от предудущих версий в 2006 это сделано хорошо, а предыдущие версии мне крови попортили.
  • guav © (13.11.06 00:24) [16]
    > [15] Anatoly Podgoretsky ©   (13.11.06 00:23)

    Я не возражаю против UTF-8. D7 возражает.
  • Ketmar © (13.11.06 00:30) [17]
    >[16] guav(c) 13-Nov-2006, 00:24
    >Я не возражаю против UTF-8. D7 возражает.
    нотепадом её убивать.
  • Anatoly Podgoretsky © (13.11.06 00:30) [18]
    > guav  (13.11.2006 0:24:16)  [16]

    Знаю, но это не первый раз, не считая свойств. Издержки. Ну не хочет Борланд сделать раз и навсегда Юникод, а на дворе уже 2006 год.
    Сообственно уже в Д6 были зачатки, тексты кодировались с некотором текстовом подобии Юникод и вот тут то и возникала подлянка при переносе на машину с другой локализацией, хотели сделать хорошо, а получилось как всегда и трудно было программировать тексты более чем на одном языке, хоть в 2006 сделали что-то более приличное, но до нормального еще далеко.
  • Anatoly Podgoretsky © (13.11.06 00:31) [19]
    > Ketmar  (13.11.2006 0:30:17)  [17]

    Убить то можно, не будет ли других проблем?
  • Ketmar © (13.11.06 00:32) [20]
    >[19] Anatoly Podgoretsky(c) 13-Nov-2006, 00:31
    >Убить то можно, не будет ли других проблем?
    так всё равно без абсолюта не работает, какая разница...
  • Anatoly Podgoretsky © (13.11.06 00:36) [21]
    > Ketmar  (13.11.2006 0:32:20)  [20]

    Возможно с данным проектом это и пойдет, конечно на русской локализации, зато другие мои проекты включают как минимум два языка и к сожалению нет достойного набора компонент для полной, нормальной реализации, TNT не перекрывает даже потребности баз данных, например отсутствие TTntDBLookupComboBox потребовало искать обходные пути, но это и к лучшему, почти везде где можно отказался от dbAware компонент, что благоприятно повлияло на проекты, а иначе бы так и сидел на них.
  • Ketmar © (13.11.06 00:38) [22]
    мда. dbaware -- удобно, но такая гадость... %-)
  • Anatoly Podgoretsky © (13.11.06 00:41) [23]
    > Ketmar  (13.11.2006 0:38:22)  [22]

    Да не гадость, но меньшая управляемость, зато теперь красота - SELECT/INSERT/UPDATE короткие транзакции, кроме читающей SELECT и никаких проблем со сложными запросами.
  • guav © (13.11.06 00:45) [24]

    > [17] Ketmar ©   (13.11.06 00:30)

    Уже, причём именно ноутпадом


    > да и повторение кода в каждой форме уже может быть поводом
    > для придирки

    Это опрометчивое заявление. ReadSettings все разные.

    В одном есть несущий магический смысл Exit.

    procedure TMainForm.ReadSettings;
    begin
     with TRegistry.Create do
     try
       OpenKey(RegBase + 'MainForm', True);
       if ValueExists('Left') then begin
         ... end
       else begin
         ...
         Exit;
       end;
     finally
       Free;
     end;
    end;


    В другой есть except (я понимаю, зачем он там нужен, вопрос скорее почему в других местах нет).

    Копипаст - зло, ошибки нужно делать и исправлять в одном месте.
  • Ketmar © (13.11.06 00:50) [25]
    >[24] guav(c) 13-Nov-2006, 00:45
    можно сократить до
    >ошибки нужно делать
    %-)
  • Anatoly Podgoretsky © (13.11.06 00:51) [26]
    > guav  (13.11.2006 0:45:24)  [24]

    В других местах его нет потому что там пользовательские, а не серверные функции и исключение не смертельно для сервера, а наоборот пользователь узнает о нем.
    Главный ReadSettings как раз другой. Ну и второй вариант, может я чего то не учел.
    Кроме того эти другие от отличаются и подходом, в них записаны характеристики форм, если в реестре нет значения, то оно будет создано при закрытии, иначе будут использованы дизайнтайм характеристики.

    Поэтому подход дифферинцирован, но надо будет внимательно посмотреть, нет ли каких блох.
  • Anatoly Podgoretsky © (13.11.06 00:56) [27]
    > guav  (13.11.2006 0:45:24)  [24]

    Ой посмотрел код, не совсем так, совсем не так, except вообще не нужен, можно будет убрать, пусть стандартная обработка работает, а главный серверный защищен с помощью ValueExists
    Но можно и не менять, разве только для единства стиля. И так и так результат одинаковый и более того вероятность возникновения ошибка в TRegistry.Create практически равна нулю и если такая вероятность есть тут уже не до моей программы, живым бы ноги унести, это говорит что у системы серьезные проблемы.
    Конечно есть определенная непоследовательность и как ты справедливо заметил, из-за китайского метода, все никак не могу себя от него отучить, проблемы из-за него постоянно возникают.
  • Ketmar © (13.11.06 00:59) [28]
    нормальный метод. наследие времён, когда платили за количество строк. %-)
  • guav © (13.11.06 01:10) [29]
    > [25] Ketmar ©   (13.11.06 00:50)

    Можно. Но это и так очевидно.
    Можно до "ошибки нужно делать и исправлять" - это тоже очевидно.
    А вот "ошибки нужно делать и исправлять в одном месте." - уже аргумент против копипаста.


    > [27] Anatoly Podgoretsky ©   (13.11.06 00:56)
    > из-за китайского метода, все никак
    > не могу себя от него отучить, проблемы из-за него постоянно
    > возникают.

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

    Вообще, там столько переменных публикуемых типов пишется и читается в реестр, что запуздыривание их в класс и запись/чтение через RTTI не только сделает код менее "китайским", но и уменьшит размер иходников.
  • guav © (13.11.06 01:15) [30]
    > [28] Ketmar ©   (13.11.06 00:59)
    > нормальный метод.

    В основном, да. Легко писать, легко трассировать.
    Однако модифицировать такой код потом трудно: где-то можно забыть исправить. И баги по несколько раз исправлять приходится.
  • Ketmar © (13.11.06 01:34) [31]
    >[30] guav(c) 13-Nov-2006, 01:15
    не надо мне про это рассказывать. знаком не по-наслышке. %-)
  • guav © (13.11.06 01:40) [32]
    > [31] Ketmar ©   (13.11.06 01:34)
    > не надо мне про это рассказывать.

    и то правда.

    Что меня побудило скачать исходники - ошибки АРС, причём не в том, что касается протоколов, но в более простых вещах. Хотел увидеть, как так может быть. Увидел, что там просто код даже более "китайский", чем мой.
  • Ketmar © (13.11.06 01:55) [33]
    >[32] guav(c) 13-Nov-2006, 01:40
    >просто код даже более "китайский", чем мой.
    CDM такой же. %-)
  • guav © (13.11.06 02:07) [34]
    а я вообще писать клиента не буду.

    а шокирующий меня пример копипаста я увидел в генофонде:
    перегруженные версии FloatToText, FloatToTextFmt и FormatBuf не разделяют единую реализацию, я предполагал, что из версий без const FormatSettings: TFormatSettings вызываются вкрсии с оным, оказалось - нет, копипаст.
  • Gero © (13.11.06 02:14) [35]
    Я уже молчу про DMClient, который начал писать один человек, не собираясь никому показывать ни исходный код, ни саму программу, а теперь дописывает другой.
  • Anatoly Podgoretsky © (13.11.06 09:13) [36]
    > Gero  (13.11.2006 02:14:35)  [35]

    Он чего боялся чтоли?
    Я например не боюсь показывать любой код, как бы плохо он не был написан.
  • Gero © (13.11.06 09:19) [37]
    > [36] Anatoly Podgoretsky ©   (13.11.06 09:13)

    Почему же, не боялся, и код потом был опубликован.
  • Anatoly Podgoretsky © (13.11.06 09:21) [38]
    > guav  (13.11.2006 01:10:29)  [29]

    > Я обычно пишу таким образом места, которые сразу не могу писать нормально, но потом специально выискиваю "китайский" код и исправляю.

    Видел бы ты как писался код, сколько раз он изменялся по данной причине, поскольку не только не ясно как нормально, а вообще не ясно как вообще, многочисленый трассировки с воссождание различных ситуаций, тем более что нельзя сразу написать для всех вариатов, которых просто очень много, неизвестные реакции серверов на различные ситуации и при этом сервер должен оставаться в любом случае живым, это же не клиент. Вот если буду писать другой сервер то будет полегче, уже известны многие проблемы.
    Документация - ожидалось, что в RFC все описано, оказалось что нет, один формат XOVER столько пришлось перешерстить Интернета, все ссылаются на одного чувака, мол у него описан формат, а все ссылки на него мертвые и датированы прошлым веком, еле еле нашел одно единственное место, где была нужная мне строчка. А код как код, можно писать с разными вариантами, сути не меняет.
  • Anatoly Podgoretsky © (13.11.06 09:24) [39]
    > guav  (13.11.2006 01:15:30)  [30]

    Не, китайский метод, это зло, именно забывается и особенно когда идентификаторы близкие по написанию и старое описание то есть и оно валидное, компилятор тут не помогает. Но время ускоряет невероятно, только нужно быть скрупулезно внимательным, но и то пропускаешь, если же писать не этом методом, то не будет единства стиля, сам же в него меня ткнул вчера и дольше, но более надежно.
  • Anatoly Podgoretsky © (13.11.06 09:57) [40]
    > Gero  (13.11.2006 09:19:37)  [37]

    Ну я не про потом.
    Да ладно, шучу я :-)
  • Gero © (13.11.06 10:37) [41]
    > [40] Anatoly Podgoretsky ©   (13.11.06 09:57)

    А, я сразу не понял о чем речь ;)
  • guav © (13.11.06 13:50) [42]
    > [38] Anatoly Podgoretsky ©   (13.11.06 09:21)

    Ну так на места, в которых уже всё понятно, можно переписывать, причём по возможности до написания нового кода.


    > старое описание то есть и оно валидное, компилятор тут
    > не помогает.

    Для старого описания есть такая штука
    //

    или директива
    depercated




    > Документация - ожидалось, что в RFC все описано, оказалось
    > что нет

    Бывает.
    Не на всё есть хелп и МСДН, кое-что и выдумывать приходится :-(


    > [33] Ketmar ©   (13.11.06 01:55)


    > [35] Gero ©   (13.11.06 02:14)

    Никого я не обвиняю (было бы в чём), но реальность суровая...
    В код других клиентов не вникал, теперь боюсь.

    зы: завёл тему про копирование в борландовских ньюзгрупах, посмотрим насколько китайцы дружные ;-)
  • Anatoly Podgoretsky © (13.11.06 14:53) [43]
    > guav  (13.11.2006 13:50:42)  [42]

    > Не на всё есть хелп и МСДН, кое-что и выдумывать приходится

    Статус все таки разные, пока я искал я обратил внимание, что кроме меня еще множество народу ищет и в ответ что несуразное, например обращаться в Беркли, мол там есть один человек, который это знает. А ведь это одна их базовых команд и без ее формата реализовать сервер невозможно.
    Но что хорошо, что есть альтернатива - гнусный XHDR, по крайней мере ОЕ если определяет, что XOVER не поддержан, то переходит на него. Но я например неуверен, что многие другие клиенты смогут работать если XOVER не будет поддержан.

    > Для старого описания есть такая штука // или директива depercated

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

    := XXX1.YYY

    XXX1 валиден, а нужен XXX2 - очень легко нарваться, если не изменил, и программа будет работать, поскольку и XXX1 и XXX2 валидны в месте применения, в одном блоке, но будет непонятно, почему иногда результаты не те, это китайское противодействие. Конечно пример простой, но понятно о чем речь. Если куски копирования маленькие, то конечно не ошибешься, а если сотни строк, то элементарно. Но китайские метод дает хорошие характеристики по скорости, в ущерб надежности. Поэтому последнее время приучаю себя не копировать, пусть дольше, но надежнее. В данном сервере я допустил несколько ляпов подобного рода, но во время обнаружил, в итоге вместо экономии была потеря времени и нервов.

    Но к сожалению пока еще это плохо выходит, надо быть настойчивее и сразу бить по рукам самого себя.

    Кстати Д2006 очень плохо относится к китайскому методу, при копировании блока свойств и связаных объявлений обработчиков - она просто довольно быстро зависает, при том намертво, так что приходится снимать из процессов. И то с трудом. В рефакторинге я не нашел функции по полю создать одноименное свойство и Get/Set методы
  • Anatoly Podgoretsky © (13.11.06 15:08) [44]
    К вопросу об клиентском скрипте, вот данное сообщение было перемещено в 13:16 а оповещение поступило только сейчас, вместе с ним перемещалось еще одно сообщение, оповещения пока нет


    --= Eagle =-- © (13.11.2006 13:16) [D7, Win2k, WinXP]
    »» Перемещено в конференцию "WinAPI"
  • Anatoly Podgoretsky © (13.11.06 15:11) [45]
    Вот наконей поступило, но как удаленое, о чем ввиде ошибки сообщил OE
  • Anatoly Podgoretsky © (13.11.06 15:16) [46]
    > Anatoly Podgoretsky  (13.11.2006 15:08:44)  [44]

    Вот спустя 5 минут пришло и второе оповещение, хотя разница в секунды и кроме того скрипт выдал в рассылке список уже давно удаленые (перемещеные) сообщения и как прикажешь с подобным жить?

    --
  • Anatoly Podgoretsky © (13.11.06 15:22) [47]
    Вот теперь еще раз выдал, уже повторно.
  • guav © (15.11.06 01:36) [48]
    > if MultiByteToWideChar(cp_utf8, 0, PChar(S), -1, PWideChar(WS)
    > , Length(WS) + 1) = 0 then begin


    cbMultiByte
    [in] Specifies the size in bytes of the string pointed to by the lpMultiByteStr parameter, or it can be -1 if the string is null terminated. Note that if cbMultiByte is 0, the function fails.



    Т.е. -1 не обязательно, можно смело передавать Length, которая в байтах тоже.
  • Другой © (15.11.06 05:54) [49]
    Gero ©   (13.11.06 02:14) [35]
    Я уже молчу про DMClient, который начал писать один человек, не собираясь никому показывать ни исходный код, ни саму программу, а теперь дописывает другой.


    Ничего я не дописывал! :)

    Anatoly Podgoretsky ©   (13.11.06 09:21) [38]
    Документация - ожидалось, что в RFC все описано, оказалось что нет, один формат XOVER столько пришлось перешерстить Интернета


    Анатолий, я тоже искал, а как оказолось это банальный STAT :)
  • Другой © (15.11.06 05:54) [50]
    оказолось это банальный STAT :)

    Имею ввиду, формат
  • Anatoly Podgoretsky © (15.11.06 09:16) [51]
    > guav  (15.11.2006 01:36:48)  [48]

    Ну и какой Length ты передашь для utf-8
  • Anatoly Podgoretsky © (15.11.06 09:20) [52]
    > Другой  (15.11.2006 05:54:49)  [49]

    Даже если бы это было и так, то в rfc нет никакого намека на это, но на самом деле ничего даже близкого к STAT нет и не пахнет
  • Anatoly Podgoretsky © (15.11.06 09:20) [53]
    > Другой  (15.11.2006 05:54:50)  [50]

    И я это же имею в виду.
  • guav © (15.11.06 10:19) [54]
    > [51] Anatoly Podgoretsky ©   (15.11.06 09:16)
    > Ну и какой Length ты передашь для utf-8

    Тот что возращаеся Length(). Он в байтах.
  • Anatoly Podgoretsky © (15.11.06 10:47) [55]
    > guav  (15.11.2006 10:19:54)  [54]

    То есть то что я говорил про двойной вызов функции, а данное предложение я понял как про одинарный вызов функии.
    Пусть прояснится, что он имел в виду.
  • Anatoly Podgoretsky © (15.11.06 19:12) [56]
    > Anatoly Podgoretsky  (15.11.2006 10:47:55)  [55]

    moder=app
    action=close
  • Anatoly Podgoretsky © (15.11.06 19:17) [57]
    moder=app
    action=move 6
  • Наиль © (20.04.07 09:23) [58]
    > Кстати Д2006 очень плохо относится к китайскому методу,
    > при копировании блока свойств и связаных объявлений обработчиков
    > - она просто довольно быстро зависает, при том намертво,
    > так что приходится снимать из процессов. И то с трудом.

    Такое бывает, если установлен Punto Switcher, до v2.8 включительно,
    с включеной фунцией "сохранение буфера обмена в дневнике".
    Лично я пользуюсь этой функцией, для восстановления кода (текста),
    который долго набирал, но не сумел сохранить.
    Или в случае неудачной отправки сообщения из клиента.
  • VpNS (30.09.09 06:27) [59]
    Дату поста вижу, но всяк случай напишу если у кого нить подобные грабли будут))))

    вместо MultiByteToWideChar юзайте
    StringToWideChar

    или так

    function StringToWChar(const S: string): PWideChar;
    var
     Buffer: array[0..127] of WideChar;
    begin
     result:=StringToWideChar(S, Buffer, SizeOf(Buffer) div 2);
    end;
  • Anatoly Podgoretsky © (04.11.09 13:02) [60]
    Просто поднял, что бы легче было новеньким.
  • Vasia (19.06.11 22:55) [61]
    Вот у меня проблеам:
    Есть набор китайских иероглифов, знаю точно что в мультибайте, и их надо вывести в поле Edit1.Text.
    Я никак не могу понять в чём моя проблема:
    MultiByteToWideChar(CP_UTF8,0,PAnsiChar(List3[number].gfx[1]),-1,PWideChar(wc),0);
    Edit1.Text:=wc;

    //     var     gfx: Array[0..127] of AnsiChar;(ну он в записи стоит)
                   wc:widechar;
    Надеюсь на Вашу помощь!
    Заранее спасибо!
 
Конференция "Журнал" » APC: Ошибка в коде (?) или снова про MultiByteToWideChar
Есть новые Нет новых   [103787   +11][b:0.002][p:0.006]