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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сумма элементов массива, посчитать сумму элементов 
:(
    Опции темы
Poseidon
Дата 16.3.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(VICTAR @  16.3.2008,  00:14 Найти цитируемый пост)
ЗЫ не двухместный, а двухмерный
Не двухмерный, а двумерный smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
VICTAR
Дата 16.3.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Poseidon @  16.3.2008,  13:53 Найти цитируемый пост)
Не двухмерный, а двумерный

Вопрос риторический.
Поиск по гуглу дает результаты как по первому, так и по второму названию.
Не буду спорить, ибо сам не знаю как правильней  smile 
PM MAIL   Вверх
neweraser
Дата 16.3.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



можно сделать комментарии к этому коду? А то чтот никак не могу разобраться, особенно в первый раз встречаю move и inc  smile 
Код

..............
i := 0;
  j := 0;
  lSum := 0;
  lMax := High(lSource);
  while i <= lMax do
  begin
    if ((lSum + lSource[i]) > MaxSize) or (i = lMax) then
    begin
      SetLength(lDest, i - j);
      Move(lSource[j], lDest[0], (i - j) * SizeOf(Integer));
      j := i;
      lSum := 0;
      //записываешь диск (размеры в массиве lDest)
    Inc(lSum, lSource[i]);
    Inc(i);
  end;


Это сообщение отредактировал(а) neweraser - 16.3.2008, 15:17


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 16.3.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

i := 0;
  j := 0;
  lSum := 0;
  lMax := High(lSource); //полседний эл-нт массива
  while i <= lMax do
  begin
    if ((lSum + lSource[i]) > MaxSize) //если текущий размер + след. элемент массива превышают норму 
      or (i = lMax) then //или это последний элемент
    begin
      SetLength(lDest, i - j); //устнавливаем нужный размер для массива
      Move(lSource[j], lDest[0], (i - j) * SizeOf(Integer)); //копируем из исходного массива в получившийся (i - j) * SizeOf(Integer) БАЙТ
      j := i;
      lSum := 0;
      //записываешь диск (размеры в массиве lDest)
    Inc(lSum, lSource[i]); // равносильно lSum := lSum + lSource[i]
    Inc(i); //равносильно i := i +1
  end;


Это сообщение отредактировал(а) VICTAR - 16.3.2008, 15:36
PM MAIL   Вверх
neweraser
Дата 16.3.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ага, спасибо, а зачем там SizeOf? И еще, хочу проверить, так ли заполняются массивы, выписывая их в listbox
Код

for r:= 0 to high(lSource) do
listbox3.Items.add(IntToStr(lDest[r]));

пишет ошибку Access Violation (Ошибка выделения памяти, мож ошибаюсь, не знаю).
до этого со статическими массивами получалось



--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 16.3.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Move копирует кол-во байт, я специально выделил БАЙТ.
Массив состоит из Integer. Т.е. Размер всего массива будет кол-во элементов * размер каждого элемента (4 байта).
AV возникает из-за того что перебираешь один массив(lSource) а читаешь другой(lDest).
Заметь, длины у них разные.

ЗЫ Access Violation - это когда читаешь/пишешь туда куда низя =) 
PM MAIL   Вверх
neweraser
Дата 16.3.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VICTAR @  16.3.2008,  17:44 Найти цитируемый пост)
AV возникает из-за того что перебираешь один массив(lSource) а читаешь другой(lDest).

мда... тупанул я, поторопился  smile 


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
neweraser
Дата 16.3.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ничего не понимаю... у меня, оказывается, исходный массив еще и не так заполняется:
Код

SetLength(lSource, listbox2.Items.Capacity);
for i := 0 to High(lSource) and listbox2.Items.Count do
FSize(listbox2.Items[i]);
listbox3.Clear;
for r:= 0 to high(lSource) do
listbox3.Items.add(IntToStr(lSource[r]));


вот функция
Код

function FSize(FileName: string):integer;
var
  SearchRec: TSearchRec;
  i: integer;
begin
  Result:=0;
  if FindFirst(ExpandFileName(FileName) ,faAnyfile ,SearchRec )=0 then
  Result:=SearchRec.Size;
  FindClose(SearchRec);
  lSource[i]:=result;
end;


когда вывожу массив в листбокс выводит вроде все вроде правильно, но 1-й элемент = 0


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 16.3.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ничего не понял.
1) listbox2.Items.Capacity замени на listbox2.Items.Count
2) for i := 0 to High(lSource) and listbox2.Items.Count do как это?
3) во втором примере i у тебя локальная переменная, изначально имеющая неопределенное значение, а ты через нее обращаешься в элементу массива lSource, тут должно быть стабильное AV.
Короче разберись для начала в своем коде.

PM MAIL   Вверх
neweraser
Дата 16.3.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VICTAR @  16.3.2008,  18:53 Найти цитируемый пост)
2) for i := 0 to High(lSource) and listbox2.Items.Count do как это?

получается только так, если делать с каждым по отдельности выдает ошибку, насчет i я действительно тупанул, в прочем, у меня не редко так... записал новую переменную t в глобальные, приравниваю ее к нулю перед тем как обратиться к массиву в функции, а в самой функции еще прописал Inc(t)

Это сообщение отредактировал(а) neweraser - 16.3.2008, 23:09


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
neweraser
Дата 17.3.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



и последний вопрос, если можно.
Можно ли остановить этот цикл в процедуре в определенном месте (т.е. где идет запись на диск) до тех пор, пока, например "пользователь" не нажмет на кнопку еще раз?
и чем отличаются counts и capacity?


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 17.3.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(neweraser @  17.3.2008,  19:34 Найти цитируемый пост)
Можно ли остановить этот цикл в процедуре в определенном месте (т.е. где идет запись на диск) до тех пор, пока, например "пользователь" не нажмет на кнопку еще раз?

Вызвать модальную форму?

Цитата(neweraser @  17.3.2008,  19:34 Найти цитируемый пост)
и чем отличаются counts и capacity? 

Count  - Кол-во занятых элементов массива
Сapacity -  Кол-во элементов массива
PM MAIL   Вверх
neweraser
Дата 17.3.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VICTAR @  17.3.2008,  20:03 Найти цитируемый пост)
Вызвать модальную форму?

думаю, да, так даже лучше и проще будет, форму создам, как то уже делал модальные формы, только где ее вызвать и как? например 

Код

....................
j := i;
lSum := 0;
//записываешь диск (размеры в массиве lDest)
// например, здесь?
if WaitForm.ShowModal = mrOK then continue; // так?
......................




--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 17.3.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Смотря что ты хочешь сделать. 
Если хочешь выйти из цикла, то break.
Если продолжить цикл, то просто WaitForm.ShowModal.
PM MAIL   Вверх
neweraser
Дата 17.3.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



VICTAR, я наверно надоел тебе уже  smile , но тут осталось один цикл сделать, что-то ничего не получается, мне нужно сравнивать каждую переменную массива lDest с переменными (размерами файлов) в listbox3, потом номера найденных переменных в listbox3 сравнивать с номерами переменных (путей к файлам) в listbox2 и отсюда по этим номерам заполнять listbox4, это ведь не сложно сделать?


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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