Текущий архив: 2011.09.04;
Скачать: CL | DM;
Вниз
Работает заведомо нерабочий код. Найти похожие ветки
← →
Дмитрий С © (2011-05-15 12:24) [0]У вас такое бывает?
Написал какой-то код, проверил - вроде работает, продолжаешь разработку, проходит неделя-другая - тот код работает, и вдруг начинает работать какой-то только что написанный код. Начинаешь искать, и видишь, что написанное недели две назад не может работать даже в принципе.
Была у меня такая функция:Array.prototype.IndexOf2 = function (Value, StartIndex) {
if (!StartIndex) StartIndex = 0;
if (this.indexOf) {
var i = this.indexOf(Value, StartIndex);
if (i<0) return false;
//!!!!!!!
} else {
for(var i=StartIndex; i<this.length; i++)
if (this[i]==Value) return i;
return false;
}
}
Написана очень давно (сейчас б я так не стал делать), но все, же, несложно заметить, что вместо восклицательных знаков должно быть return i. Вот и спрашивается, как работа этой функции устраивала раньше? У меня это не первый случай. Ну и ваши такие случаи?
← →
Ega23 © (2011-05-15 14:00) [1]Нетипизированные языки сжечь. Отрубить руки-ноги, вырвать ему его себя, над трупом надругаться, а после - сжечь. Пепел развеять на Эвересте.
← →
TUser © (2011-05-15 14:06) [2]экстремистов - давить, после чего подвергать страшным мучениям :-)
на самом деле у нетипизированных - своя ниша, мелочи на них реально проще делать
← →
DiamondShark © (2011-05-15 14:39) [3]
> Вот и спрашивается, как работа этой функции устраивала раньше?
Возвращала иногдаundefined
. Что вызывающим кодом интерпретировалось как неудачный поиск.
Поведение, конечно, нифига не правильное, но исключений не было, и всем было пофиг: ну подумаешь, некоторые части иногда брешут. Но не падает же. Тестированием на валидность результатов никто не занимался.
← →
Юрий Зотов © (2011-05-15 14:55) [4]Обратный пример - не работает заведомо рабочий (казалось бы) код - цикл с явным счетчиком вдруг стал бесконечным.
Язык PL/1.
DCL I DEC FIXED(1); /* Соответствует Паскалевскому var I: 0..9; */
DO I=0,9 /* Соответствует Паскалевскому for I:=0 to 9 do begin */
... /* Тело цикла */
END;
Искал плюху 2 дня. С тех пор появилась привычка включать Check Range.
:o)
← →
TUser © (2011-05-15 15:49) [5]У меня вот цикл for в Turbo Delphi выполнялся в обратном направлении, причем счетчик цикла в его теле используется. Оптимизатор тоже умеет делать глюки.
← →
Германн © (2011-05-15 16:46) [6]
> У меня вот цикл for в Turbo Delphi выполнялся в обратном
> направлении, причем счетчик цикла в его теле используется.
> Оптимизатор тоже умеет делать глюки.
Оптимизатор имеет право менять направление цикла, даже если счетчик цикла используется внутри цикла.
← →
virex(mobile) (2011-05-15 17:42) [7]>Дмитрий С © (15.05.11 12:24) [0]
после "оптимизации" кода, некоторый рабочий перестает работать, а не рабочий вновь начинает работать
вчерашний случай с андроид клиентом форума: сделал загрузку из базы в потоке, все робило без проблем... для теста удалил базу - не робит, пришлось восстанавливать старый код
← →
TUser © (2011-05-15 18:22) [8]
> Оптимизатор имеет право менять направление цикла, даже если
> счетчик цикла используется внутри цикла.
С каких пор? Вообще-то, оптимизатор не имеет права влиять на результат выполнения кода, а следовательно на направление цикла, если счетчик внутри используется.
← →
Германн © (2011-05-15 18:40) [9]
> Вообще-то, оптимизатор не имеет права влиять на результат
> выполнения кода, а следовательно на направление цикла, если
> счетчик внутри используется.
Смотря как используется.
← →
TUser © (2011-05-15 18:59) [10]Имхо, если используется, то трудно придумать ситуацию, когда оптимизатор может гарантированно знать, что его правки безопасны. Из-за многопоточности.
В моем конкретном случае, результат функции изменялся в результате оптимизации, а так делать нельзя.
← →
Германн © (2011-05-15 19:13) [11]http://forum.sources.ru/index.php?showtopic=331557
Вот тут обсуждался один из таких примеров.
← →
TUser © (2011-05-15 19:26) [12]
> Германн © (15.05.11 19:13) [11]
>
> http://forum.sources.ru/index.php?showtopic=331557
> Вот тут обсуждался один из таких примеров.
>
Ужос, очевидно, что от работы оптимизатора Result получает иное значение. У меня похожий пример был, что-то типа
for i := 1 to ...
if a[i] = 0 then
break
else
if a[i] = a[i-1] then
Aaaa
← →
TUser © (2011-05-15 19:29) [13]По поводу ответа CodeMonkey - ну вот практика показывает, что цикл работает неправильно.
← →
sniknik © (2011-05-15 20:56) [14]> По поводу ответа CodeMonkey - ну вот практика показывает, что цикл работает неправильно.
а ты проверь. цикл там как раз работает правильно
CodeMonkey объясняет почему... но кто то смотрит только на переменную, которая вообще не причем (заменяется регистровой).
ну вот, чтобы без ссылок// Получаем префикс времени
function GetTimePrefix(N: Integer): String;
const
pref: array [0..6] of string = (" г. ", " м. ", " н. ", " д. ", " ч. ", " мин. ", " сек. ");
del: array [0..6] of Integer = (31536000, 2592000, 604800, 86400, 3600, 60, 1);
var
a: array [0..6] of Integer;
i: integer;
begin
Result := "";
a[6] := N;
for i := 0 to 5 do begin
a[i] := a[6] div del[i];
a[6] := a[6] mod del[i];
if a[i] <> 0 then
Result := Result + IntToStr(a[i]) + pref[i];
end
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
Edit1.Text:= GetTimePrefix(1);
end;
ставим точку останова в начало, и смотрим не только на i но и на значения массива a, как они изменяются (а они там в цикле меняются), и видим что хоть i и меняется от 6 ти, но массив заполняется с 0... т.е. переменная i "обманка". "фикция", на результат не влияет. потому и неважно с какой стороны ее считать.
Страницы: 1 вся ветка
Текущий архив: 2011.09.04;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.004 c