Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.09.04;
Скачать: [xml.tar.bz2];

Вниз

Работает заведомо нерабочий код.   Найти похожие ветки 

 
Дмитрий С ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
15-1302343273
RGV
2011-04-09 14:01
2011.09.04
TWebBrowser в режиме редактирования


2-1305638430
ok
2011-05-17 17:20
2011.09.04
Узнать какой radiobutton нажат


2-1305938346
Drowsy
2011-05-21 04:39
2011.09.04
В какой системной таблице Firebird2.5


15-1305138754
NailMan
2011-05-11 22:32
2011.09.04
Ну наконец то начало что то получаться


3-1263635532
victor
2010-01-16 12:52
2011.09.04
обновление данных в ADODataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский