Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.128.129] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Столкнулся тут со странной проблемой. Весь код обыскал - ну всё, казалось бы, правильно. Методом научного тыка выяснил, что проблема кроется в коде:
for n := 0 to LoginCount.Count-1 do begin for m := 0 to PassCount.Count-1 do begin Login := LoginCount.Strings[n]; Password := PassCount.Strings[m]; POST; end; end; При первом же запуске и значение "m", и значение "n" принимают свои максимальные значения. А должны принимать значение "0". Я пол дня ломал над этим голову. Поискал по Интернету - оказывается я не один такой. У некоторых тоже встречается эта проблема. Решают её либо переписыванием неугодного кода, либо отключением оптимизации в свойствах компилятора. Отключал - не помогает. Кто-нибудь может объяснить, почему так происходит и как мне это победить? |
Сообщ.
#2
,
|
|
|
Цитата Navern @ При первом же запуске и значение "m", и значение "n" принимают свои максимальные значения Отладчиком прошелся? В какой точке смотришь значения переменных? В теле цикла(ов)? |
Сообщ.
#3
,
|
|
|
В настройках компилятора отключи оптимизацию. Это именно она пускает циклы с конца.
|
Сообщ.
#4
,
|
|
|
Оптимизация в Делфях не доведена до ума, даже если отключить оптимизацию, то компилятор все равно кое-что оптимизирует
|
Сообщ.
#5
,
|
|
|
Testudo, оптимизацию отключал, я писал об этом. Не помогло... Альтернативы отключению оптимизации есть?
|
Сообщ.
#6
,
|
|
|
циклы while сделай, да и всё.
|
Сообщ.
#7
,
|
|
|
Цитата Navern @ Альтернативы отключению оптимизации есть? замени for на While |
Сообщ.
#8
,
|
|
|
Цитата Navern @ При первом же запуске и значение "m", и значение "n" принимают свои максимальные значения var LoginCount, PassCount: TStrings; n, m: Integer; Login, PAssword: string; begin PassCount := nil; LoginCount :=TStringList.Create; try PassCount := TStringList.Create; for n := 0 to 10 - 1 do begin PassCount.Add(IntToStr(n)); LoginCount.Add(IntToStr(n)); end; for n := 0 to LoginCount.Count-1 do begin for m := 0 to PassCount.Count-1 do begin ShowMessage(Format('n = %d, m = %d', [n, m])); Login := LoginCount.Strings[n]; Password := PassCount.Strings[m]; // POST; end; end; finally PassCount.Free; LoginCount.Free; end; end; Первое сообщение соджержит текст: --------------------------- Project7 --------------------------- n = 0, m = 0 --------------------------- OK --------------------------- Что я делаю не так? |
Сообщ.
#9
,
|
|
|
Цитата jack128 @ Что я делаю не так? Вот это: Цитата jack128 @ ShowMessage(Format('n = %d, m = %d', [n, m])); |
Сообщ.
#10
,
|
|
|
Domino
а чем это не правельно? |
Сообщ.
#11
,
|
|
|
Компилятор выполняет подобную оптимизацию, когда результат выполнения не зависит от направления цикла.
for I := 0 to 10 do Result := Result + Values[I]; for I := 10 downto 0 do Result := Result + Values[I]; for I := 0 to 10 do begin ShowMessage(Format('Добавляем %d...', [I])) Result := Result + Values[I]; end; Navern, в большинстве случаев такая "оригинальная" оптимизация компилятора не мешает, но в твоем случае, если тебе важен порядок взлома чего-то там, измени логику метода. |
Сообщ.
#12
,
|
|
|
Domino, ладно, спасибо. Попробую переписать по-другому.
|
Сообщ.
#13
,
|
|
|
Цитата Domino @ for I := 0 to 10 do Result := Result + Values[I]; будет скомпилировано как for I := 10 downto 0 do Result := Result + Values[I]; Да ? Не уж то компилятор обладает навыками телепатии?? Хотелось бы конечно, но маловероятно. Нажми Alt + Ctrl + C и посмотри сам во что компилируется твой код. |
Сообщ.
#14
,
|
|
|
Цитата jack128 @ Не уж то компилятор обладает навыками телепатии? Случается. Цитата jack128 @ Нажми Alt + Ctrl + C и посмотри сам во что компилируется твой код. Хм, и вправду. Запостил не проверив. Но это точно есть! Позже, если я найду у себя код, где это проявлялось, то выложу. А вот здесь точно цикл переворачивается (и не только переворачивается): for I := 5 to 9 do S := S + 1; |
Сообщ.
#15
,
|
|
|
Цитата Domino @ А вот здесь точно цикл переворачивается (и не только переворачивается): здесь - да, переворачивается. Но в этом цикле ты счетчик цикла ВООБЩЕ не используешь. А в #1 - счетчик используется - поэтому разворота цикла быть не может. |