Ошибки, баги, вопросы - страница 3150

 
Nikolai Semko #:

все же тернарный оператор смотрится более лаконично (ИМХО)

int limit = prev_calculated==0 ? 0: prev_calculated-1;

еще более лаконичный способ :

int limit = prev_calculated-bool(prev_calculated);

:))

 
Nikolai Semko #:

я уже писал, что при такой конструкции вы обращаетесь к индексу буфера с номером rates_total (когда prev_calculated == 0 ). 
А это переполнение, так как  rates_total - это размер буфера, последний элемент которого  rates_total -1

Да я понимаю почему переполнение происходит сейчас!

Почему раньше работала эта конструкция, а теперь не работает?

int limit = rates_total-prev_calculated;

for(int i=limit; i>=0; i--)

Потому что буфер аллоцируется ровно на  rates_total 
а не  rates_total +1

Жду что Артём скажет, он понимает суть вопроса.
 
Roman #:

Да я понимаю почему переполнение происходит сейчас!

Почему раньше работала эта конструкция, а теперь не работает?

Потому что буфер аллоцируется ровно на  rates_total 
а не  rates_total +1

чудес не бывает. 
Раньше если работало, то значит это был другой код

 
Roman #:

При такой конструкции 


индикаторный буфер выходит за пределы.

Покажи пожалуйста пример для тиков с циклом i>=0
может я что подзабыл, и не так делаю.

 грубо уменьшаю на 2 или 3 индекс на максимальном краю для верности.)

 
Nikolai Semko #:

чудес не бывает. 
Раньше если работало, то значит это был другой код

Раньше правильный расчёт limit был

int limit = rates_total-1-prev_calculated;

и заходил в цикл i>=0

for(int i=limit; i>=0; i--)

А теперь не заходит, потому что limit получается -1

 
Это обсуждение здесь оффтоп, ему место в какой-нибудь новичковой ветке
 
Roman #:

Раньше правильный расчёт limit был

и заходил в цикл i>=0

А теперь не заходит, потому что limit получается -1

раньше тоже не мог заходить с этим же кодом
не сочиняйте

у Хатимлянского скачайте старый билд и проверьте, если не верите.

 
TheXpert #:
Это обсуждение здесь оффтоп, ему место в какой-нибудь новичковой ветке

Если не пользовался этой конструкцией раньше, то воздержись со своим офтопом.

 
Nikolai Semko #:

раньше тоже не мог заходить с этим же кодом
не сочиняйте

у Хатимлянского скачайте старый билд и проверьте, если не верите.

Артём тоже пользовался этой конструкцией.
Что и описал он выше, поэтому только он тут понимает проблему. 

 
Roman #:

Раньше правильный расчёт limit был

и заходил в цикл i>=0

А теперь не заходит, потому что limit получается -1

Всегда была проверка: if(limit>1) limit=rates_total-1. Это для случаев, если нет в расчётах i+сколько_то. Если есть, то эти "сколько-то" нужно включать в конструкцию: limit=rates_total-1-сколько_то.

Без неё всегда был выход за пределы массива. Ведь rates_total - это ни что иное как Bars(). Соответственно, если баров 5000, и мы обращаемся к индексу 5000, то выходим за пределы массива (подсчёт-то баров с нуля начинается).

В вашем примере не правильный расчёт limit:

int limit = rates_total-1-prev_calculated;

Должен быть таким:

int limit = rates_total-prev_calculated;

А после него проверка на limit>1

и если limit таки больше единицы, то limit = rates_total-1

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