Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Сумма динамического массива


Автор: zvonkolokola 11.9.2009, 21:28
Динамический массив числового типа, как правильно вывести сумму чисел массива?
И подскажите как обнулить массив ?

Код

  public
  var
   kolpoz: integer;
   shirina:array of integer;
end; 

procedure TForm4.Button1Click(Sender: TObject);
var
i: integer;
kolpoz:=DataModule5.ADOTablikis.RecordCount;

 DataModule5.ADOTablikis.RecNo:=1;
 SetLength(Shirina,kolpoz);
 for i := 0 to kolpoz do
 begin
 DataModule5.ADOTablikis.RecNo:=i+1; 
 Shirina[i+1]:=DataModule5.ADOTablikis.FieldByName('Shirina').asinteger;
ShowMessage(IntToStr(SumInt(Shirina)));//последний элемент массива не считает, гдето ошибка
end;  

Автор: aragnophy 12.9.2009, 10:21
Массив-то размерностью [0 . .length-1] создаётся.
Значит будет работать только с 
Код

for i := 0 to kolpoz - 1 do


 Shirina[i+1] - также вызовет range checking error, в массиве то от [0 . . kolpoz - 1]  элементов
Обнулить можно ZeroMemory, либо FillMemory, либо, 
Setlength(Shirina, 0)...

Автор: zvonkolokola 12.9.2009, 18:54
Цитата

ZeroMemory, либо FillMemory.
Можно подробнее?
Я пишу название массива.......например: -    
Код

Shirina.ZeroMemory
 или  
Код

SetLength(Shirina,ZeroMemory);
Но это не прокатывает.

Автор: THandle 12.9.2009, 19:01
zvonkolokola, ZeroMemory - это функция. Можно еще просто присваиванием nil. Но смотря что вообще надо - обнулить все элементы массива или же установить длину в 0 и все удалить.

Автор: Frees 12.9.2009, 19:28
Цитата(THandle @  12.9.2009,  22:01 Найти цитируемый пост)
Можно еще просто присваиванием nil

а память разве не утечет в таком случае?

Автор: THandle 12.9.2009, 20:40
Цитата(Frees @  12.9.2009,  20:28 Найти цитируемый пост)
а память разве не утечет в таком случае? 


Нет. В обоих случаях будет вызвана одна и та же DynArrayClear smile

Автор: zvonkolokola 13.9.2009, 23:12
Цитата

ZeroMemory - это функция. Можно еще просто присваиванием nil. Но смотря что вообще надо - обнулить все элементы массива или же установить длину в 0 и все удалить.
При повторном нажатии кнопки вылетает ошибка, я предпалагаю что это из-за переполненого массива.
Я хочу обнулить все элементы массива, а вообще есть разница?

Я сначало (первым делом) обнуляю все, потом выполняется код.........
При повторном событии сперва обнуляется массив и опять выполняется код.
procedure TForm4.Button1Click(Sender: TObject);
Код

var
i: integer;
begin

SetLength(pozdetal,0);//обнулил вот таким способом

kolpoz:=DataModule5.ADOTablikis.RecordCount;
 Edit1.Text:=floattostr(kolpoz);
 SetLength(pozdetal,kolpoz+1);
 for i := 0 to kolpoz do
 begin
 DataModule5.ADOTablikis.RecNo:=i+1;
 pozdetal[i+1]:=DataModule5.ADOTablikis.FieldByName('poz').asinteger;
 end;
ShowMessage(IntToStr(SumInt(pozdetal)));
end..........

Автор: virtualmacar 18.9.2009, 13:15
Чтобы правильно обнулить динамический массив можно использовать 
FreeAndNil('дикриптор массива');
Но для пущей надежности 
в цикле прогнать  присвоение Nill всем элементам
Можно использовать  FreeMem(var P: Pointer[; Size: Integer]);
Вообще всё есть в справке по Delphi  smile так что учите мат часть


Автор: kami 18.9.2009, 17:01
Цитата(virtualmacar @  18.9.2009,  13:15 Найти цитируемый пост)
учите мат часть

Это относится в вам в первую очередь.
Ибо FreeAndNil относится к объектам, и на инициализированном массиве выдаст AV.

Автор: kami 18.9.2009, 17:18
Код

var
i: integer;
begin

[S]SetLength(pozdetal,0);//обнулил вот таким способом[/S]// это лишнее - все равно
// у массива будет новая длина и каждому элементу будет присвоено новое значение.

kolpoz:=DataModule5.ADOTablikis.RecordCount;
 Edit1.Text:=floattostr(kolpoz);// а почему float а не intToStr? с каких пор количество элементов - дробное число?
 SetLength(pozdetal,kolpoz);
 for i := 0 to kolpoz-1 do
 begin
 DataModule5.ADOTablikis.RecNo:=i+1;// не работаю с БД, но если RecNo начинается с 0, то +1 тут тоже лишнее.
 pozdetal[i]:=DataModule5.ADOTablikis.FieldByName('poz').asinteger;
 end;
ShowMessage(IntToStr(SumInt(pozdetal)));
end.


Резюмируя - Ваша проблема в несовсем верной работе с массивами, индекс которых начинается с 0.

Автор: Romikgy 18.9.2009, 19:55
Цитата(zvonkolokola @ 11.9.2009,  20:28)
Динамический массив числового типа, как правильно вывести сумму чисел массива?
И подскажите как обнулить массив ?

Код

  public
  var
   kolpoz: integer;
   shirina:array of integer;
end; 

procedure TForm4.Button1Click(Sender: TObject);
var
i: integer;
kolpoz:=DataModule5.ADOTablikis.RecordCount;

 DataModule5.ADOTablikis.RecNo:=1;
 SetLength(Shirina,kolpoz);
 for i := 0 to kolpoz do
 begin
 DataModule5.ADOTablikis.RecNo:=i+1; 
 Shirina[i+1]:=DataModule5.ADOTablikis.FieldByName('Shirina').asinteger;
ShowMessage(IntToStr(SumInt(Shirina)));//последний элемент массива не считает, гдето ошибка
end;  

по поставленой задаче динам. массив вообще не нужен,
суммируй сразу в переменую из полей датасета, имхо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)