Как ни странно, от этого получилась польза, в виде следующего куска кода, стабильно глючащего в FPC, если включена оптимизация выше второго уровня.
По идее Digest должен быть равен 80 по окончании, однако с оптимизацией это не так - получается какое-то левое, увеличивающееся (вместе с текущим временем?) от запуска к запуску число.
Засабмитил баг:
http://bugs.freepascal.org/view.php?id=11053
Однако фиксить не спешат. Может в более новых версиях FPC его нет? Или проявляется только под виндой?
Мне особенно интересно, потому как мой проект тоже глючит, будучи собранным с оптимизациями выше второго уровня.
Просьба потестировать данный код:
- Код: Выделить всё
- program Project1;
 {$APPTYPE CONSOLE}
 uses
 Windows;
 const height = 1;
 width = 1;
 var pix: array [0..height-1,0..width-1] of Integer;
 procedure Main;
 var
 dx, dy: Integer;
 Color, digest: cardinal;
 cx, cy, zx, zy: Double;
 time: Integer;
 scale: Double;
 deep: Integer;
 begin
 FillChar(pix, SizeOf(pix), $f0);
 scale := 0.05;
 deep := 30;
 Digest := 0;
 time := GetTickCount();
 for dy := 0 to height -1 do
 begin
 cy := (dy - height / 2) * scale;
 for dx := 0 to width - 1 do
 begin
 color := 0;
 cx := (dx - width / 2) * scale;
 zx := cx;
 zy := cy;
 while zx * zx + zy * zy < 1 do
 begin
 zx := zx * zx - zy * zy + cx;
 zy := 2 * zx * zy + cy;
 Inc( color );
 if color > Cardinal(deep) then break;
 end;
 pix[ dy, dx ] := color;
 end;
 end;
 pix[ 0, 0 ] := 80;
 time := GetTickCount() - time;
 Digest := 0;
 for dy := 0 to height -1 do for dx := 0 to width - 1 do Digest := Digest + pix[dy, dx];
 WriteLn( time,
 ' ', digest // should be 80
 );
 Readln;
 end;
 begin
 Main;
 end.





 

