Как использовать DLL в программе для Маркета? - страница 2

 
<p><br>Внимательно читайте правила маркета, в частности пункт 4.2: запрещен вызов любых dll, включая системные. Таким образом, Вы нарушите правила самим фактом вызова dll, пустой или нет. По этой же причине, вызов реальной библиотеки, которую вы подсунете своему продукту в аттаче, будет также неприемлем.</p>
 
VDev:

Сорри, надо было дефайны тоже включить. Когда tbIdx==TICK_BUF_SIZE, получается tbIdx &= TICK_BUF_MAX_IDX; => tbIdx == 0. Как вы поняли, это для работы с входным кольцевым буфером. Вообще, это из старого кода, когда я сочинял софт для слабеньких процов, типа для карманных плейров, там приходилось каждый такт экономить. На современных, скорее всего, будет срабатывать предсказание переходов в обычном if ))

Честно говоря, мало что понял из вашего объяснения. Какая разница, дефайны это или не дефайны, если в них выражение всё-равно в скобках.  Математически ничего не меняется.   Результат, получаемый после вашей "оптимизации", не соответствует первоначальному результату в любом случае.
 
C-4:
<p><br>Внимательно читайте правила маркета, в частности пункт 4.2: запрещен вызов любых dll, включая системные. Таким образом, Вы нарушите правила самим фактом вызова dll, пустой или нет. По этой же причине, вызов реальной библиотеки, которую вы подсунете своему продукту в аттаче, будет также неприемлем.</p>
Ну, пока представитель MQ таких возражений не высказал. Ведь я в поставке для маркета не вызываю никакие DLL, да это и невозможно технически. Я вызываю библиотеку на MQL. А то, что пользователь скачал дополнения и установил их на свой страх и риск, я про это даже и не знаю, если он сам мне не сообщит из чувства благодарности. ИМХО, с юридической точки зрения я прав.
 
meat:
Честно говоря, мало что понял из вашего объяснения. Какая разница, дефайны это или не дефайны, если в них выражение всё-равно в скобках.  Математически ничего не меняется.   Результат, получаемый после вашей "оптимизации", не соответствует первоначальному результату в любом случае.

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

Пример:

#define TICK_BUF_SIZE       0x1000              // 4096
#define TICK_BUF_MAX_IDX    TICK_BUF_SIZE - 1   // 0xFFF - неправильная запись дефайна без скобок!!!

int result = 10 * TICK_BUF_MAX_IDX; // = 10 * 4096 -1 = 40959
//--------------------------------------------------
#define TICK_BUF_SIZE       0x1000              // 4096
#define TICK_BUF_MAX_IDX    (TICK_BUF_SIZE - 1) // 0xFFF - правильная запись дефайна

int result = 10 * TICK_BUF_MAX_IDX; // = 10 * (4096 -1) = 40950

Теперь по теме. Когда tbIdx доходит до значения 0x1000, производится операция битовое И

tbIdx &= TICK_BUF_MAX_IDX;

или, раскрывая дефайн

tbIdx &= 0x0FFF;

Результат битовой операции  0x1000 & 0x0FFF будет равен нулю, индекс кольцевого буфера tbIdx перескакивает на нулевой элемент.  Надеюсь, теперь все ясно.

 
VDev:
 

Теперь по теме. Когда tbIdx доходит до значения 0x1000, производится операция битовое И

Что значит "когда доходит"?  Операция вообще-то производится всегда, начиная с самой первой итерации.  Соответственно и нули у вас пойдут с самого начала.
 
meat:
Что значит "когда доходит"?  Операция вообще-то производится всегда, начиная с самой первой итерации.

Вы же в маркет продукт на продажу выставили, то есть не новичок, что в этом коде непонятного???

for (int n = 0; n < asize; n++)
{
    tbIdx++;
    /* вместо
    if(tbIdx > TICK_BUF_MAX_IDX)
        tbIdx = 0;
    */
    tbIdx &= TICK_BUF_MAX_IDX; // небольшая оптимизация вместо if
    acc += TickBuf[tbIdx] * Coeff[n];
}

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

 
VDev:
Ну, пока представитель MQ таких возражений не высказал. Ведь я в поставке для маркета не вызываю никакие DLL, да это и невозможно технически. Я вызываю библиотеку на MQL. А то, что пользователь скачал дополнения и установил их на свой страх и риск, я про это даже и не знаю, если он сам мне не сообщит из чувства благодарности. ИМХО, с юридической точки зрения я прав.

Какие комментарии вы ждете, когда фраза "запрещены любые DLL" была несколько раз скопирована сюда?

Ни одна программа, которая содержит в себе import блоки, не будет принята даже на техническом уровне.

 
VDev:
 

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

Ещё раз повторю, оно обнуляется не "когда", а обнуляется с самого начала цикла. Вот вы меня как-раз очень удивляете.  Вы хоть банальным принтом пробовали вывести значения вашей переменной?
 
meat:
Ещё раз повторю, оно обнуляется не "когда", а обнуляется с самого начала цикла. Вот вы меня как-раз очень удивляете.  Вы хоть банальным принтом пробовали вывести значения вашей переменной?

Почему это она обнуляется с самого начала цикла?

Только напишите конкретно, без общих фраз. До цикла выполняется строка

int tbIdx = TickBufIdx; // например, tbIdx теперь равна 123, в цикле значение инкрементировалось

...

for (int n = 0; n < asize; n++)
{
    tbIdx++; // == 124
    tbIdx &= TICK_BUF_MAX_IDX; // Чему будет равно выражение 124 & 0x0FFF ?


Зачем мне принт для школьной арифметики...

 
VDev:

Почему это она обнуляется с самого начала цикла?

Только напишите конкретно, без общих фраз. До цикла выполняется строка

int tbIdx = TickBufIdx; // например, tbIdx теперь равна 123

Речь не про "например", а про логику алгоритма.  У вас нигде не указано, что tbIdx - это константа равная 123.  И не видно никакой проверки вначале, типа  if (tbIdx>0xFFF) return.  А мы не телепаты.

Причина обращения: