Текущий архив: 2005.08.21;
Скачать: CL | DM;
Вниз
Как быть Найти похожие ветки
← →
Nikus (2005-08-03 19:24) [0]Простой тест Delphi на вшивость:
program test;
var
i : integer;
mas : array[0..9] of double;
begin
for i:=0 to 9 do begin
mas[i] := sin(5);
end;
end.
Нажимаем F7 (трассировка), входим в тело цикла, подводим крысу к i и наблюдаем значение... думаете 0? Ан нет! 10. И с каждой итерацией убавляется на 1. Заменим sin(5) на sin(i) - и всё стаёт на свои места.
Мой вывод: компилятор ради оптимизации скорости выполнения готов крутить цикл задом наперёд, если в теле цикла не вызывается какая-нибудь функция с параметром i. Но при этом он не учитывает начальное и конечное значение i! Вместо того, чтобы крутить цикл от 9 до 0, он его крутит от 10 до 1, и в нашем примере происходит запись за пределы границ массива! Попробуем поменять 0 и 9 на 1 и 10 соответственно, или на 101 и 100 - абсолютно нет разницы... Так же крутит от 10 до 1.
У меня программа, конечно, посложнее, но там происходит то же самое. Писать sin(i); в теле цикла я не хочу - мой модуль реализует БПФ и он критичен к скорости. Массивы там динамические, элементы отсчитываются от 0, и выделять память под ещё одну ячейку, и хранить данные со сдвигом на 1 тоже не дело. Подскажите как быть. Терять оптимизацию я тоже не хочу - БПФ...
Версия Delphi 7.0 Enterprise, Build 4.453. ОС: Windows XP sp1
← →
Джо © (2005-08-03 19:29) [1]Так в чем проблема? Для приведенного кода порядок заполнения массива монопенисуален.
← →
Nikus © (2005-08-03 19:33) [2]Проблема в том, что происходит запись в элемент массива mas[10] в данном примере. Моя программа с БПФ после такого цикла тихо вылетает!
← →
Nikus © (2005-08-03 19:38) [3]Или вот ещё пример (инициализация модуля БПФ):
d := 1;
for i:=0 to 31 do begin
W2n[i].re := cos(2*PI/d);
W2n[i].im := -sin(2*PI/d);
d := d * 2;
end;
После этого я вполне ВПРАВЕ ожидать, что в массиве W2n лежат нужные мне данные. На самом деле они там лежат задом наперёд! Плюс ещё запись за границы... Естественно, с таким массивом ни о каком БПФ говорить не придётся.
← →
Джо © (2005-08-03 19:40) [4]Нет, в mas[10] не будет записано ничего, что бы не показывал отладчик. На первой же итерации будет присвоение mas[0] := sin(5).
← →
Джо © (2005-08-03 19:40) [5]И что за БПФ?
← →
Nikus © (2005-08-03 19:45) [6]Быстрое преобразование Фурье
Страницы: 1 вся ветка
Текущий архив: 2005.08.21;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.039 c