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

Поиск:

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


Опытный
**


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

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



Добрый день, так ли я считаю сумму элементов одномерного массива?
Код

procedure TMainForm.BtnClick(Sender: TObject);
var
  mas: array [0..99] of integer;
  i: integer;
begin
  // ...
  // заполнение массива
  // ...
  for i:= Low(mas) to High(mas) do
  sum:= (sum + mas[i]);
  showmessage(inttostr(sum));
end;


Это сообщение отредактировал(а) neweraser - 15.3.2008, 14:48


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


Дикий Кот. =^.^=
****
Награды: 1



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

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



Похоже на правду.  2 некритичных замечания:
1) sum должна быть локальной переменной либо перед подсчетом суммы ее нужно обнулять;
2) 
Код
sum:= (sum + mas[i]);
 скобки здесь явно лишние.




--------------------
PM MAIL WWW GTalk Jabber   Вверх
VICTAR
Дата 15.3.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Для лентяев есть
Код

uses Math;
...
 ShowMessage(IntToStr(SumInt(mas)));

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


Опытный
**


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

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



Спасибо, то что для лентяев мне больше подходит  smile

Добавлено через 6 минут и 25 секунд
а есть такая же функция типа SumInt, которая возвращает количество элементов массива?


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


Эксперт
***


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

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



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


Опытный
**


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

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



не, length тут мне несовсем подходит, она выдает длину массива (у меня array [0..100] и выдает 100), я имел в виду именно количество элементов, записанных в массив


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


Опытный
**


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

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



neweraser

Length(Arr)+1  smile 


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
neweraser
Дата 15.3.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(lukas @  15.3.2008,  16:09 Найти цитируемый пост)
Length(Arr)+1   

101 пишет  smile 


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


Эксперт
***


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

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



Цитата(neweraser @  15.3.2008,  16:03 Найти цитируемый пост)
количество элементов, записанных в массив

Можно пояснить?
PM MAIL   Вверх
neweraser
Дата 15.3.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



до этого
Код

showmessage(inttostr(Length(mas)));

писал 100 элементов, а Length(mas)+1  пишет 101 элемент, мож это я так сильно туплю и все перепутал... не знаю


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


Эксперт
***


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

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



Что должно было "написать"???
PM MAIL   Вверх
neweraser
Дата 15.3.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну у меня массив [0..99], заполняется он не полностью, когда 15 элементов, когда 20 и т.д, вот именно на сколько он заполнен мне и надо узнать...
а может проще создать динамический массив? тогда по идее length будет верно выдавать...


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


Эксперт
***


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

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



Цитата(neweraser @  15.3.2008,  16:41 Найти цитируемый пост)
а может проще создать динамический массив?

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


Опытный
**


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

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



что-то ничего не понимаю, делаю динамический - не заполняется...


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


Опытный
**


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

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



neweraser

статистический массив уже заполнен мусором... поэтому нужно использовать динамический массив и использовать процедуру SetLength


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
neweraser
Дата 15.3.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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


Опытный
**


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

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



даже так пробовал
Код

var
  mas1: array [0..1, 0..99] of string;
  mas2: array of integer;
...
repeat
  begin
  setlength(mas2, i);
  mas2[i]:= StrToInt(mas1[0, i]);
  i:= i + 1;
end;
until SumInt(mas2) < 875000;

ошибки пишет

Это сообщение отредактировал(а) neweraser - 15.3.2008, 18:41


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


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Ууууууууу.... Как все запущено... Я, честно говоря, не совсем понял задачу, но пример переделал так:
Код

var
  mas1: array [0..1, 0..99] of string;
  mas2: array of integer;
  i: integer;
  lSum: integer;
...
begin
  i := 0;
  lSum := 0;
  repeat
    setlength(mas2, i);
    mas2[i]:= StrToInt(mas1[0, i]);
    Inc(lSum, mas2[i]);
    Inc(i);
  until lSum < 875000;
end;



--------------------
user posted image
PM MAIL WWW Skype   Вверх
neweraser
Дата 15.3.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пишет ошибку Access Violation из-за строчки
Код

mas2[i]:= StrToInt(mas1[0, i]);



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


Эксперт
***


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

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



setlength(mas2, i + 1);

Добавлено через 1 минуту и 30 секунд
И вообще если i будет больше 99 то выйдем за пределы второго массива.
Короче придумай другое решение.

Добавлено через 2 минуты и 21 секунду
И последнее, перераспределять постоянно пямять (SetLength) не есть гуд
PM MAIL   Вверх
Qu1nt
Дата 15.3.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

SetLength(mas2, i + 1);

Торможжу... (%

Это сообщение отредактировал(а) Qu1nt - 15.3.2008, 20:34
PM MAIL   Вверх
neweraser
Дата 15.3.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



получается так, что в массив вводится только один элемент... не знаю, что тут можно придумать...
VICTAR,
Цитата(VICTAR @  15.3.2008,  20:31 Найти цитируемый пост)
перераспределять постоянно пямять (SetLength) не есть гуд 

объясни пожалуйста, почему


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


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



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

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



Цитата(neweraser @  15.3.2008,  21:05 Найти цитируемый пост)
объясни пожалуйста, почему

может получится Out of Memory.
PM   Вверх
neweraser
Дата 15.3.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



тогда не знаю, может здесь можно обойтись без массива, а добавлять куда-нибудь в строки типа stringlist или listbox? ну там, по идее, тоже нужно выделять память, как вы думаете тут можно что-нибудь еще сделать?


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


Эксперт
***


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

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



Цитата(neweraser @  15.3.2008,  21:05 Найти цитируемый пост)
объясни пожалуйста, почему

Это долгая и не рациональная процедура.
Память нужно выделять по возможности с запасом, как например делается в TList (Capacity).

Цитата(neweraser @  15.3.2008,  21:37 Найти цитируемый пост)
тогда не знаю, может здесь можно обойтись без массива,

Объясни подробней задачу, что ты хочешь получить. 
PM MAIL   Вверх
neweraser
Дата 15.3.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VICTAR @  15.3.2008,  21:46 Найти цитируемый пост)
Объясни подробней задачу, что ты хочешь получить. 

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


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


Эксперт
***


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

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



Вот что-нибудь в этом роде
Код

procedure TForm1.Button1Click(Sender: TObject);
const
  MaxSize = 875000;
var
  lSource, //исходный массив
  lDest: array of Integer;
  lSum,
    i,
    j,
    lMax: Integer;
begin
  Randomize;
  SetLength(lSource, Random(100) + 1); //от 1 до 100
  for i := 0 to High(lSource) do      //это твой
    lSource[i] := Random(100000);     //исходный массив
  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)
    end;
    Inc(lSum, lSource[i]);
    Inc(i);
  end;
end;

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


Опытный
**


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

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



VICTAR, трудно так сразу разобраться с кодом, тут много изменений надо внести, если у меня исходный массив двухместный и типа string (в нем размеры и пути к файлам)?


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


Эксперт
***


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

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



Если массив из string, то не получится. 
Может стоит пересмотреть логику программы? (Если конечно это возможно)
ЗЫ не двухместный, а двухмерный =) 
PM MAIL   Вверх
neweraser
Дата 16.3.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



думаю, можно программу чуть переделать, тогда пути к файлам буду прописывать где-нибудь в листбоксе, а потом сверять с массивом


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


постоянно путаюсь  smile 



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


Эксперт
***


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

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



Не сложно, если понимаешь что делаешь.
Мне трудно сообразить что за алгоритм ты придумал =)
PM MAIL   Вверх
neweraser
Дата 17.3.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не знаю, как правильно сравнить
Код

.........................
for z:= 0 to high(lDest) do
for x:=0 to listbox3.Items.Count - 1 do
if lDest[z] = StrToInt(listbox3.Items.Text) {тут по-разному пробовал} then ...
..........................

как-то так пытаюсь начать, выдает ошибки


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


Эксперт
***


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

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



listbox3.Items[x]

Это сообщение отредактировал(а) VICTAR - 17.3.2008, 23:39
PM MAIL   Вверх
neweraser
Дата 18.3.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот что получилось, и это, естественно, неправильно...
Код

for z:= 0 to high(lDest) do
  for x:=0 to listbox3.Items.Count - 1 do
  if lDest[z] = StrToInt(listbox3.Items[x]) then
    for c:=0 to listbox2.Items.Count - 1 do
    if listbox3.Items[x] = listbox2.Items[c] then //вот тут не понимаю, сравнив. элементы или номера строк?
      for v:= 0 to length(lDest) do
      listbox4.Items.Add(listbox2.Items[c]);



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


Опытный
**


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

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



В offtopic

Нет, народ, все когда-то ламерами были, но когда я увидел тему "Сумма элементов массива, посчитать сумму элементов" в которой уже 4 стр. я накинулся на нее, как на хитрозакрученный детектив. Х) Смеяться не буду, т. к. сам порой дико туплю и глупости спрашиваю.

2 neweraser:

Если тебе надо в школе\инсте сделать лабу и забыть про Delphi раз и навсегда, лучше просто приведи точно задание и попроси сделать. Одногрупник отличник сделает его за баллон пива. Если надо понять, то есть книги и великая кнопка, без которой программы не пишутся, называется F1.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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