Главная страница
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.051 c
1-1122483643
Galiaf
2005-07-27 21:00
2005.08.21
Аттрибуты файлов.


14-1122469925
kull
2005-07-27 17:12
2005.08.21
Где накопать БД с русским словарем


1-1123055174
TDionis
2005-08-03 11:46
2005.08.21
Проверка eidta на наличие цифр


14-1122630536
Lexer
2005-07-29 13:48
2005.08.21
Отчётность АО должна быть в сети?


5-1093243898
Mr.Den
2004-08-23 10:51
2005.08.21
Глючит Ttimer в самописном компоненте