Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.12.2009
Сообщений: 37

Отрицательная часть динамического массива

22.03.2010, 14:58. Показов 1237. Ответов 10
Метки нет (Все метки)

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

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

А как сделать чтобы его номера были и в отрицательной области:
от f[-(n div 2)] до f[n div 2]
Спасибо большое тем кто откликнется!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2010, 14:58
Ответы с готовыми решениями:

Не работает часть кода с изменением динамического массива
Не работает функция изменения в массиве, которая спрашивает определенный индекс и изменяет числа слева и справа от этого индекса. при вводе...

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

Если сумма элементов массива отрицательная, изменить знак каждого элемента, если положительная, удвоить каждый
Заполнить двумерный массив N x N случайными числами из интервала . Найти сумму элементов. И если она отрицательная, заменить все...

10
 Аватар для Фоат
165 / 82 / 32
Регистрация: 05.02.2010
Сообщений: 318
22.03.2010, 15:33
это у тя динамич массив?

Добавлено через 1 минуту
Есть приме не для динамич масиива ча напишу

Добавлено через 17 секунд
Есть приме не для динамич масиива ча напишу

Добавлено через 2 минуты
Delphi
1
2
3
4
5
      Randomize;
  for i:=1 to n do
  for j:=1 to n do begin
                                                                  mas[i,j]:=Random       (n+n)-n;\\вот так и пишет  иотриц значения
  StringGrid1.Cells[i,j]:=IntToStr(mas[i,j]); end;
Добавлено через 52 секунды
Delphi
1
2
3
4
5
      Randomize;
  for i:=1 to n do
  for j:=1 to n do begin
                                                                  mas[i,j]:=Random       (n+n)-n;\\вот так и пишет  иотриц значения
  StringGrid1.Cells[i,j]:=IntToStr(mas[i,j]); end;
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.03.2010, 15:37
Цитата Сообщение от Smerch66 Посмотреть сообщение
А как сделать чтобы его номера были и в отрицательной области:
от f[-(n div 2)] до f[n div 2]
В динамических массивах нижняя граница индекса = 0 и изменить это значение нельзя. Можно только эмулировать. Например, так:
Delphi
1
2
3
4
5
6
//Для нечётных N:
begin
  IZero := N div 2;
  for j := -(N div 2) to (N div 2) do begin
    Arr[IZero + j] := ...;
  end;
Ещё вот такой вариант, для любых N:
Delphi
1
2
3
4
5
6
//Для чётных и нечётных N:
begin
  IZero := N div 2;
  for j := -(N div 2) to (N - 1) - (N div 2) do begin
    Arr[IZero + j] := ...;
  end;
1
0 / 0 / 0
Регистрация: 12.12.2009
Сообщений: 37
22.03.2010, 16:04  [ТС]
Спасибо!
Тогда ещё попутный вопрос.
Когда я очищаю динамический массив, то пишу
f := nil;

И почему то во время выполнения программы делфи иногда ругается на эту запись, в том случае, если делфи её выполняет уже повторно. Но перед повторным выполнением массиву задавалась новая длина.
В чём может быть причина? И есть ли аналог этого метода очищения массива?
0
 Аватар для snake32
3519 / 1702 / 236
Регистрация: 26.02.2009
Сообщений: 8,562
Записей в блоге: 6
22.03.2010, 17:18
Цитата Сообщение от Smerch66 Посмотреть сообщение
И есть ли аналог этого метода очищения массива
SetLength( f, 0 );
На сколько я знаю такие массивы не нужно очищать. Они сами себя прихлопнут, как только выйдут за пределы видимости блока в котором были объявлены.
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.03.2010, 18:13
Цитата Сообщение от snake32 Посмотреть сообщение
На сколько я знаю такие массивы не нужно очищать. Они сами себя прихлопнут, как только выйдут за пределы видимости блока в котором были объявлены.
Если элементами дин. массива F не являются данные другого дин. типа - тогда да - при выходе управления за пределы области определения переменной F произойдёт автоматическое освобождение памяти. Либо, если надо обнулить массив до прекращения процедуры, можно выполнить:
F := nil;
Но если элементами дин. массива являются данные другого дин. типа, например, типа String, тогда необходимо освобождать память через:
Finalize(F);
Это гарантирует, что память также будет освобождена из под строк, записанных в массив.
Цитата Сообщение от Smerch66 Посмотреть сообщение
f := nil;
И почему то во время выполнения программы делфи иногда ругается на эту запись, в том случае, если делфи её выполняет уже повторно. Но перед повторным выполнением массиву задавалась новая длина.
В чём может быть причина? И есть ли аналог этого метода очищения массива?
По идее, ошибок здесь быть не должно. - Если элементами массива являются нединамические типы (см. выше). Чтобы разобраться, мне надо посмотреть код или чать кода, где происходят эти действия. А что за ошибка возникает? Или это не ошибка, а предупреждение (Warning)?
1
 Аватар для snake32
3519 / 1702 / 236
Регистрация: 26.02.2009
Сообщений: 8,562
Записей в блоге: 6
24.03.2010, 19:08
Цитата Сообщение от Mawrat Посмотреть сообщение
Но если элементами дин. массива являются данные другого дин. типа, например, типа String, тогда необходимо освобождать память через:
Finalize(F);
То есть если у меня есть например такая запись
Delphi
1
2
3
4
5
6
7
var a:array of array of integer;
...
begin
SetLength( a, 20, 30 );
...
Finalize( a );//получается, обязательно нужно вызвать?
end;
Вот те раз!
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
24.03.2010, 19:18
Тогда такой код:
Delphi
1
2
3
4
5
6
7
8
9
type FOO = array of byte;
var a:array of FOO;
    b:FOO;
 
SetLength(a, 16, 16);
b := a[2];
a[1][3] := a[2][5];
Finalize(a);
b[2] := b[3];
Бряк на последней строке показывает, что b не пустой. В чем я не прав?
0
 Аватар для snake32
3519 / 1702 / 236
Регистрация: 26.02.2009
Сообщений: 8,562
Записей в блоге: 6
24.03.2010, 19:23
Vovan-VE, наверно делфя смотрит что эта область ещё юзается и не очищает.... вот напридумывали....где очищается, где нет...это всё ещё и запомнить надо... и кто после этого скажет что легче стало жить программерам?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
24.03.2010, 19:26
АГа, понял, глядя в диспетчер задач. Таки, оно учитывает кол-во ссылок.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  a, b:array of array of byte;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
    SetLength(a, 8192, 8192);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    b := a;
    Finalize(a);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
    Finalize(b);
end;
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
24.03.2010, 21:57
В этом случае Finalize() применять необязательно. Т. к. Integer - не является динамическим типом:
Delphi
1
2
3
4
5
6
7
var a:array of array of integer;
...
begin
  SetLength( a, 20, 30 );
  ...
  //Finalize( a ); //Это действие необзязательное в данном случае.
end;
Вот если бы было так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
type
var
  a : array of String;
  b : array of Variant;
begin
  SetLength(a, 10);
  SetLength(b, 10);
  ...
  //В данном случае требуется вызов Finalize(), т. к. String и Variant являются динамическими типами.
  Finalize(a);
  Finalize(b);
А вот в таком случае требуется осовобождение памяти из под элементов массива вручную. Независимо динамический или статический массив.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type
  TRec = record
    f1 : Integer;
    f2 : Double;
  end;
  TPRec = ^TRec;
var
  a : array of TPRec;
  i : Integer;
begin
  SetLength(a, 10);
  ...
  New(a[0]);
  a[0].f1 := 1;
  a[0].f2 := 1.1;
  ...
  for i := 0 to High(a) do Dispose(a[i]);
  //В данном случае Finalize() можно не вызывать.
  //Finalize(a);
Цитата Сообщение от Vovan-VE Посмотреть сообщение
АГа, понял, глядя в диспетчер задач. Таки, оно учитывает кол-во ссылок.
Да - массив это динамический тип, использующий механизм подсчёта ссылок. Динамичесий массив будет уничтожен автоматически (освобождена память выделенная для него), если количество ссылок на него станет равным нулю.
Об устройстве динамических массивов здесь можете посмотреть. Там же приведены ссылки на статьи по дин. массивам и строкам.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.03.2010, 21:57
Помогаю со студенческими работами здесь

Передача массива данных в Excel или создание двумерного динамического массива
Нашел на просторах вот такое: Dim oExcel As Object Dim oBook As Object Dim oSheet As Object 'Открыть новую книгу...

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Народ подскажите такую вещь я написал программку для вставки элементов в массив при этом осуществляется проверка границ массива ! ...

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива. Перегрузите операторы: , =, +, -,++...

Функция с применением динамического массива, чтобы размер массива увеличивался по мере необходимости
Ребята, подскажите, кто может, каким образом создать функцию с применением динамического массива, но так, чтобы размер массива увеличивался...

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива. Перегрузите операторы: , =, +, -,++ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru