Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сумма динамического массива, Суммировать массив и обнулить  
:(
    Опции темы
zvonkolokola
Дата 11.9.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



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

Код

  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;  

PM MAIL   Вверх
aragnophy
Дата 12.9.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



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

for i := 0 to kolpoz - 1 do


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

Это сообщение отредактировал(а) aragnophy - 12.9.2009, 10:29
PM MAIL   Вверх
zvonkolokola
Дата 12.9.2009, 18:54 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



Цитата

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

Shirina.ZeroMemory
 или  
Код

SetLength(Shirina,ZeroMemory);
Но это не прокатывает.
PM MAIL   Вверх
THandle
  Дата 12.9.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



zvonkolokola, ZeroMemory - это функция. Можно еще просто присваиванием nil. Но смотря что вообще надо - обнулить все элементы массива или же установить длину в 0 и все удалить.
PM   Вверх
Frees
Дата 12.9.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



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

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


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
THandle
Дата 12.9.2009, 20:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



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


Нет. В обоих случаях будет вызвана одна и та же DynArrayClear smile
PM   Вверх
zvonkolokola
Дата 13.9.2009, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



Цитата

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..........

PM MAIL   Вверх
virtualmacar
Дата 18.9.2009, 13:15 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



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


PM MAIL   Вверх
kami
Дата 18.9.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



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

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

Это сообщение отредактировал(а) kami - 18.9.2009, 17:02
PM MAIL WWW   Вверх
kami
Дата 18.9.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Код

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.

Это сообщение отредактировал(а) kami - 18.9.2009, 17:19
PM MAIL WWW   Вверх
Romikgy
Дата 18.9.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 4
Всего: 146



Цитата(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;  

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.