Блог пользователя egor-belikov

Автор egor-belikov, 15 лет назад, По-русски

Вопрос исключительно для Дельфистов и Паскалистов.

Возможно, не только у меня бывало, что счетчик в цикле начинал вести себя, как ему хочется, а не хочется мне. Пример:

for i := 1 to n do

  writeln('Bla-bla-bla');

При этом i идет от n + 1 до 2. Или еще какой-то порядок, неизвестный ни мне, ни отладчику.

Как с этим бороться?

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Напишите конкретный пример, на котором цикл работает неверно.

Возможно, вы изменяете значение переменной внутри цикла.
15 лет назад, скрыть # |
Rev. 8  
Проголосовать: нравится 0 Проголосовать: не нравится

Директива компилятора {\$O-} убирает оптимизацию, которая и является причиной таких спецэффектов.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
{O + } / {O-}?
Попробуйте второе. Если проблема убьётся, значит, как обычно, виноват оптимизатор :)
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Стоит D+,O-. 

Продолжает неправильно работать.

  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Тогда ещё полезно знать, какой компилятор вы используете.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Тут, кажется, причина в другом. Дело в том, что ф-ця length работает по разному в Делфи и Турбо Паскале. В Делфи значение этой переменной хранится в нулевой ячейке переменной, описывающей строку.
    Поэтому при неаккуратной работе со строками (особенно с st[0] - нулевой ячейкой литерного массива) может происходить всё что угодно.
    Более конкретно, не имея всего кода программы, сказать трудно.
    Кажется так, впрочем, Ваш результат нахождения причины такого поведения мне тоже интересен.
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      coor - не строка, а список списков.
      • 15 лет назад, скрыть # ^ |
        Rev. 2  
        Проголосовать: нравится 0 Проголосовать: не нравится

        А что тогда по Вашему length?
        Ведь ведёт себя эта функция по прежнему так, как сказано выше - она берёт свое значение с нулевой ячейки.
        UPD: Если Вы, конечно, не написали свою функцию под таким именем, - тогда все мои высказывания выше можно не учитывать. Я говорил о встроенной в Делфи ф-ции и её неадекватном поведении.
15 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
It isn't a normal behaviour...

But, why "unknown for me and debugger"? Just try for i:=1 to n do writeln(i);
This suffices to check the correct behaviour of the loop.

Also you should check if you do something with "i" inside the loop.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
в делфи 7 где-то в свойствах проекта, я уже не помню где, можно убрать галочку "Optimization" тогда в дебагере многие "кривые" переменные становятся "ровными".
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Напишите пожалуйста очень короткую но целую программульку демонстрирующую ваш вопрос (не фрагмент как выше), тогда коллегам не придётся заниматься телепатией и лечением по фотографии.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
может у вас переменная int64?
у меня до сих пор  смутное отвращение к int64 в качестве счетчика for цикла, кажется были какие-то неприятности, причем на дельфи