Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1122444445
syte_ser78
2005-07-27 10:07
2005.08.21
Где AVG хранит свои базы?


14-1122362835
VID
2005-07-26 11:27
2005.08.21
Привет


14-1122495978
Qwertyk
2005-07-28 00:26
2005.08.21
Как избавиться от разводов


10-1100072720
Polevi
2004-11-10 10:45
2005.08.21
TCP туннель DCOM


14-1122635764
boriskb
2005-07-29 15:16
2005.08.21
Отпуск.