Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2010, 14:52   #1
Smerch66
Пользователь
 
Регистрация: 22.03.2010
Сообщений: 33
По умолчанию setlength

Подскажите пожалуйста решение следующей проблемы:
//задаю массив
f : array of Float;
...
//задаю его размер
setlength(f , N);

После этого у нас массив размерности N, а вот элементы массива начинаются с 0, то есть:
f[0] , f[1] и т.д.

А как сделать чтобы его номера были и в отрицательной области:
от f[-(n div 2)] до f[n div 2]
Спасибо большое тем кто откликнется!
Smerch66 вне форума Ответить с цитированием
Старый 22.03.2010, 15:00   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

либо использовать статический массив
var
f: array[-5..10] of float;

либо никак

Цитата:
Dynamic arrays are always integer-indexed, always starting from 0.
найдено delphi7 F1 dynamic arrays
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.03.2010, 16:04   #3
Smerch66
Пользователь
 
Регистрация: 22.03.2010
Сообщений: 33
По умолчанию

Спасибо!
Тогда ещё попутный вопрос.
Когда я очищаю динамический массив, то пишу
f := nil;

И почему то во время выполнения программы делфи иногда ругается на эту запись, в том случае, если делфи её выполняет уже повторно. Но перед повторным выполнением массиву задавалась новая длина.
В чём может быть причина? И есть ли аналог этого метода очищения массива?
Smerch66 вне форума Ответить с цитированием
Старый 22.03.2010, 16:30   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Это не очищение, это присваивание неопределенного адреса массиву. Ошибку вызывает скорее попытка задать новую длину для f, к-рый ссылается на nil, чем простая смена адреса, к-рая по сути своей процедура безобидная, хоть и приводит к таким нехорошим результатам.

Если не нужно менять размерность то есть три способа обнулить:
1. ZeroMemory(...) //функция из Win API, обнуление блока памяти, параметры смотри в справке
2. SetLength(f, 0); SetLength(f, OldLength); //обнулили длину и затем опять устанавливаем старую длину,
элементы после этого будут равны нулю
3. for i:=0 to Length(f)-1 do f[i]:=0;
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 22.03.2010 в 16:39.
mutabor вне форума Ответить с цитированием
Старый 22.03.2010, 16:54   #5
Smerch66
Пользователь
 
Регистрация: 22.03.2010
Сообщений: 33
По умолчанию

Спасибо! второй способ самый приемлемый!
Smerch66 вне форума Ответить с цитированием
Старый 22.03.2010, 17:00   #6
Smerch66
Пользователь
 
Регистрация: 22.03.2010
Сообщений: 33
По умолчанию

Хотя всё равно ошибка вылетает даже по второму способу.
Я вот думаю что дело в библиотеке intel, я этот массив сую в БПФ этой библиотеки.
После этого массив отказывается обнуляться. Ошибка пишет что неверная Floating операция
Smerch66 вне форума Ответить с цитированием
Старый 22.03.2010, 18:24   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

В БПФ массив может начинаться с единицы. Может в этом причина.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 22.03.2010, 18:49   #8
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Есть одно "но", mutabor, по поводу 2 пункта: элементы вовсе не обяхательно будут равны 0, просто новая память под них выделится.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 22.03.2010, 19:32   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Selestis Посмотреть сообщение
элементы вовсе не обяхательно будут равны 0,
Будут, выделяемая память заполняется нулями.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько параметров в SetLength Alex Cones Общие вопросы Delphi 9 21.03.2010 14:00
SetLength никогда не стирает старые элементы массива? TwiX Общие вопросы Delphi 6 20.03.2010 02:35
Вкаких случаях может быть полезной процедура SetLength Ainur Помощь студентам 2 22.05.2009 12:01
считает что ReOpArr это обычный массив и не может применить к нему процедуру SetLength. Dunpeal Общие вопросы Delphi 2 24.12.2007 08:07