Как ни странно, от этого получилась польза, в виде следующего куска кода, стабильно глючащего в 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.