0 / 0 / 0
Регистрация: 12.12.2009
Сообщений: 37
1

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

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

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

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

А как сделать чтобы его номера были и в отрицательной области:
от f[-(n div 2)] до f[n div 2]
Спасибо большое тем кто откликнется!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2010, 14:58
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 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
13094 / 5875 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
22.03.2010, 15:37 3
Цитата Сообщение от 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  [ТС] 4
Спасибо!
Тогда ещё попутный вопрос.
Когда я очищаю динамический массив, то пишу
f := nil;

И почему то во время выполнения программы делфи иногда ругается на эту запись, в том случае, если делфи её выполняет уже повторно. Но перед повторным выполнением массиву задавалась новая длина.
В чём может быть причина? И есть ли аналог этого метода очищения массива?
0
3230 / 1420 / 233
Регистрация: 26.02.2009
Сообщений: 7,373
Записей в блоге: 5
22.03.2010, 17:18 5
Цитата Сообщение от Smerch66 Посмотреть сообщение
И есть ли аналог этого метода очищения массива
SetLength( f, 0 );
На сколько я знаю такие массивы не нужно очищать. Они сами себя прихлопнут, как только выйдут за пределы видимости блока в котором были объявлены.
0
13094 / 5875 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
22.03.2010, 18:13 6
Цитата Сообщение от snake32 Посмотреть сообщение
На сколько я знаю такие массивы не нужно очищать. Они сами себя прихлопнут, как только выйдут за пределы видимости блока в котором были объявлены.
Если элементами дин. массива F не являются данные другого дин. типа - тогда да - при выходе управления за пределы области определения переменной F произойдёт автоматическое освобождение памяти. Либо, если надо обнулить массив до прекращения процедуры, можно выполнить:
F := nil;
Но если элементами дин. массива являются данные другого дин. типа, например, типа String, тогда необходимо освобождать память через:
Finalize(F);
Это гарантирует, что память также будет освобождена из под строк, записанных в массив.
Цитата Сообщение от Smerch66 Посмотреть сообщение
f := nil;
И почему то во время выполнения программы делфи иногда ругается на эту запись, в том случае, если делфи её выполняет уже повторно. Но перед повторным выполнением массиву задавалась новая длина.
В чём может быть причина? И есть ли аналог этого метода очищения массива?
По идее, ошибок здесь быть не должно. - Если элементами массива являются нединамические типы (см. выше). Чтобы разобраться, мне надо посмотреть код или чать кода, где происходят эти действия. А что за ошибка возникает? Или это не ошибка, а предупреждение (Warning)?
1
3230 / 1420 / 233
Регистрация: 26.02.2009
Сообщений: 7,373
Записей в блоге: 5
24.03.2010, 19:08 7
Цитата Сообщение от 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
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
24.03.2010, 19:18 8
Тогда такой код:
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
3230 / 1420 / 233
Регистрация: 26.02.2009
Сообщений: 7,373
Записей в блоге: 5
24.03.2010, 19:23 9
Vovan-VE, наверно делфя смотрит что эта область ещё юзается и не очищает.... вот напридумывали....где очищается, где нет...это всё ещё и запомнить надо... и кто после этого скажет что легче стало жить программерам?
0
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
24.03.2010, 19:26 10
АГа, понял, глядя в диспетчер задач. Таки, оно учитывает кол-во ссылок.
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
13094 / 5875 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
24.03.2010, 21:57 11
В этом случае 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2010, 21:57
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru