Предупреждение "Приоритет константы завышен"

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Аватара пользователя
Magic
топ-софт
Сообщения: 35
Зарегистрирован: Вт, 20/11/2007 10:30
Имя Фамилия: Роман Тищенко
Откуда: Галактика-Украина
Контактная информация:

Предупреждение "Приоритет константы завышен"

Сообщение Magic »

Получил при компиляции vip-файла предупреждение:

Предупреждение: ConstantPreference=On : Приоритет константы COBUHSCHET завышен
and coBuhSchet == AttrNam.WTable
^

Что означает это предупреждение?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение cruger »

Исчерпывающая информация на этот счёт ищется в документации по слову
ConstantPreference
Аватара пользователя
Magic
топ-софт
Сообщения: 35
Зарегистрирован: Вт, 20/11/2007 10:30
Имя Фамилия: Роман Тищенко
Откуда: Галактика-Украина
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение Magic »

В документации я уже искал.
Все, что удалось найти (В книге "Инструменты и утилиты"):

1.3. ПАРАМЕТРЫ КОМПИЛЯТОРА VIP
1.3.1. Секция [Compilers]: Настройки всех компиляторов
ConstantPreference
Тип
Да/Нет
Назначение
При поиске идентификаторов отдавать предпочтение константам
Синоним
/CP+
/CP-
Пример использования
ConstantPreference=off
/CP+

Соответственно, при помощи этого параметра я это предупреждение отключил.
Но вопрос звучал не "как его отключить?", а "что оно означает?".
В документации исчерпывающего ответа на это вопрос я не нашел.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение larin »

Вот такой текст есть в документе AtlDoc\asdk.chm
ConstantPreference=On : Приоритет константы <имя> завышен"
В версиях инструментария < 5.1.09 глобальные константы имели приоритет над локальными переменными и т.д. (см. 102.34648). Никакого предупреждения не выдавалось. В некоторых случаях это была причина ошибки (напр. vip\KATALOGS\CALENDAR\SPWORK.VIP(37) и т.д.), в других случаях такой порядок поиска необходим для правильной компиляции и работы (напр. vip\FIN\UTILS\DataCompress.vip(186) cPlat - и константа и поле таблицы). Идентификаторы окон и форматов также считаются константами.
Для совместимости временно добавлен параметр Compilers.ConstantPreference (включен по умолчанию) при включении которого, приоритет констант завышается и выдаётся предупреждение. От всех подобных предупреждений необходимо избавиться (напр. переименовать константу) и далее компилировать с выключенным параметром.
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Re: Предупреждение "Приоритет константы завышен"

Сообщение stix »

Тоже непонятно поведение. Объясните в чем криминал вот такой конструкции:

Код: Выделить всё

coИмяТаблицы == Table1.wTableCode
и при чем тут завышенный приоритет

А вообще, это баг: ПИР 101.44055, пока идет локализация
Кто все время правит мое сообщение? Пишите от себя пожалуйста, наберитесь мужества
Последний раз редактировалось stix Ср, 21/07/2010 10:22, всего редактировалось 4 раза.
Аватара пользователя
Magic
топ-софт
Сообщения: 35
Зарегистрирован: Вт, 20/11/2007 10:30
Имя Фамилия: Роман Тищенко
Откуда: Галактика-Украина
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение Magic »

А вообще, это баг: ПИР 101.44055, пока идет локализация :-?
Возможно с локализацией поможет такой небольшой пример.
Собираю интерфейс:

Код: Выделить всё

interface Exam0101 'Матценности';

  create view
    as select
      *
    from
      KatMC,
      AttrNam,
      AttrVal
    where((
          coKatMC      == AttrNam.WTable
      and 'Доп.поле'   == AttrNam.Name
      and coKatMC      == AttrVal.WTable
      and KatMC.NRec   == AttrVal.cRec
      and AttrNam.NRec == AttrVal.cAttrNam
    ));

  Browse B1;
    fields
      KatMC.Name 'Наименование': [40];
      KatMC.BarKod 'Код': [35];
      AttrVal.vString 'Доп.поле': [30];
  end;

  HandleEvent
    cmInsertRecord:
      insert current KatMC;
    cmUpdateRecord:
      update current KatMC;
    cmDeleteRecord:
      if Message('Вы уверены, что надо удалить запись ?',YesNo) = cmYes then
        delete current KatMC;
  end;
end.
В проектном файле подключаю только galnet.inc.
Получаю следующие сообщения в логе:

Код: Выделить всё

Предупреждение: ConstantPreference=On : Приоритет константы COKATMC завышен (стр.11, поз.24 в E:\TestConst\vip\exam0101.vip)
         coKatMC      == AttrNam.WTable
                      ^
Предупреждение: ConstantPreference=On : Приоритет константы COKATMC завышен (стр.13, поз.24 в E:\TestConst\vip\exam0101.vip)
     and coKatMC      == AttrVal.WTable
                      ^
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение Screw »

Значение coXXXX для включенных в ЛТ таблиц компилятор генерирует автоматически. По всей видимости, среди включенных в проект файлов есть такой, в котором значение coXXXX определяется явным образом - оно и перекрывает значение сгенерированной.
Аватара пользователя
Magic
топ-софт
Сообщения: 35
Зарегистрирован: Вт, 20/11/2007 10:30
Имя Фамилия: Роман Тищенко
Откуда: Галактика-Украина
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение Magic »

Screw писал(а):Значение coXXXX для включенных в ЛТ таблиц компилятор генерирует автоматически. По всей видимости, среди включенных в проект файлов есть такой, в котором значение coXXXX определяется явным образом - оно и перекрывает значение сгенерированной.
Я включаю в проектный файл один инклуд файл - galnet.inc. Он, в свою очередь, включает coConst.inc, в котором и определена константа coKatMC:
coKatMC = 1411;

Получается, для подавления этого предупреждения, разработчикам Галактики нужно убрать константы coXXXX из файла coConst.inc.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение larin »

Сборка Глалактики происходит со значением параметра ConstantPreference=off. Лучше когда локальные переменные имеют более высокий приоритет чем глобальные константы с тем же именем.

Рекомендую вам тоже поставить ConstantPreference=off.
Аватара пользователя
Magic
топ-софт
Сообщения: 35
Зарегистрирован: Вт, 20/11/2007 10:30
Имя Фамилия: Роман Тищенко
Откуда: Галактика-Украина
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение Magic »

larin писал(а):Сборка Глалактики происходит со значением параметра ConstantPreference=off. Лучше когда локальные переменные имеют более высокий приоритет чем глобальные константы с тем же именем.

Рекомендую вам тоже поставить ConstantPreference=off.
Этот параметр как раз и позволяет избежать перекрытия глобальных констант локальными.
Если он отключен повышается вероятность возникновения связанных с этим ошибок в коде.
Пока, конечно, компилируем свои проекты с ConstantPreference=off.

P.S. Судя по логам сборки исходников Галактики, предупреждения, возникающие при компиляции, похоже, мало кого из разработчиков волнуют. :)
Но это еще не повод поступать в собственных разработках так же.
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Re: Предупреждение "Приоритет константы завышен"

Сообщение stix »

все равно не понятно. Константы определены в файле galnet.inc. Больше никакого определения нет. Почему предупреждение то. Получается в любом случае этот параметр должен быть выключен, для чего он тогда вообще нужен и в чем его польза?
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение larin »

Сейчас в этом параметре смысла наверно никакого нет.

Код: Выделить всё

const
  pi = 31415; // глобальная константа число ПИ
end;

interface projects;

const
  pi = 10; // локальная константа интерфейса с другим смыслом (например сокращение от project index )
end;

procedure findProjectByIndex
{
   find(pi)
}

end.
На сколько я помню. В старых версиях компилятора 2 и 3 версии, этот код пытался бы найти 31415-й проект а не 10-й. Выше упомянутое сообщение имело смысл только при переходе на новую 5-ю версию компилятора. Чтобы найти вот такие коды, с вот такими конфликтами.

На 5-й верси компилятора уже все работают много лет, и смысла в этой диагностики уже дано нет. По этому рекомендую выключить параметр и не обращать на это сообщение внимания.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение larin »

stix писал(а):все равно не понятно. Константы определены в файле galnet.inc. Больше никакого определения нет. Почему предупреждение то. Получается в любом случае этот параметр должен быть выключен, для чего он тогда вообще нужен и в чем его польза?
Вот тут

Код: Выделить всё

  create view
    as select
      *
    from
      KatMC,
      AttrNam,
      AttrVal
    where((
          coKatMC      == AttrNam.WTable
      and 'Доп.поле'   == AttrNam.Name
      and coKatMC      == AttrVal.WTable
      and KatMC.NRec   == AttrVal.cRec
      and AttrNam.NRec == AttrVal.cAttrNam
    ));
как раз и происходит то о чем говорил Screw
Значение coXXXX для включенных в ЛТ таблиц компилятор генерирует автоматически.
т.е. не явно создается локальная константа coKatMC
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Re: Предупреждение "Приоритет константы завышен"

Сообщение stix »

если автоматически зачем тогда galnet.inc?
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Предупреждение "Приоритет константы завышен"

Сообщение larin »

А компилятор "умеет" автоматически определять константы далеко не везде. Помню что coXXXX внутри create view, cmXXX внутри screen buttons.

А например здесь не умеет:

Код: Выделить всё

    Delete RefTable Where (( cgReg_Main       == RefTable.wAccount
                             and cgSel_TxoOborotClass == RefTable.wMain
                             and wListSour    == RefTable.wSub
                             and coHozObor    == RefTable.wTable1
                             and _cRec        == RefTable.cRecord1
                             and coClassSeg   == RefTable.wTable2));
Выдаст
Ошибка: Нет такой функции, поля или метода : COCLASSSEG D:\gal\G810\src\CompSrc\F\F_TXO\Vip\GetHozOper.vip(стр. 931, поз. 47)
Так что без coXXXX не обойтись.
Ответить