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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как быстрее считать данные из Memo 
V
    Опции темы
valerchi
Дата 13.8.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Помогите кто может. У меня данные из memo считываются очень долго. У меня имеется 30000 чисел, которые я вставляю в memo. Потом из memo это всё должно записываться в массив. С маленьким количеством чисел система работала, а когда я загрузил 30000 чисел, стала очень долго считывать. Что делать? Вот морй код:
Код

// чтение данных и запись в  массив
s:=0;q:=0;
repeat
if
(memo1.Text[q]=Chr(48))or(memo1.Text[q]= Chr(49))or(memo1.Text[q]= Chr(50))or(memo1.Text[q]= Chr(51)) or
(memo1.Text[q]=Chr(52))or(memo1.Text[q]= Chr(53))or(memo1.Text[q]= Chr(54))or(memo1.Text[q]= Chr(55)) or
(memo1.Text[q]=Chr(56))or(memo1.Text[q]= Chr(57))
then
begin
repeat
begin
masb[s]:=masb[s]+memo1.Text[q];
q:=q+1;
end;
until (memo1.Text[q]<>Chr(48))and(memo1.Text[q]<> Chr(49))and(memo1.Text[q]<> Chr(50))and(memo1.Text[q]<> Chr(51)) and
(memo1.Text[q]<>Chr(52))and(memo1.Text[q]<> Chr(53))and(memo1.Text[q]<> Chr(54))and(memo1.Text[q]<> Chr(55)) and
(memo1.Text[q]<>Chr(56))and(memo1.Text[q]<> Chr(57));
x:= strtoint(masb[s]);
masb[s]:= inttostr(x);
s:=s+1;
end
else
q:=q+1;
until memo1.Text[q]='';


Добавлено через 3 минуты
И может кто знает, что такое "memo of out"
PM MAIL   Вверх
kami
Дата 13.8.2011, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



"немного" упростим  smile 
Код

procedure TForm6.q(Sender: TObject);
var
  iPos, iArr: integer;
  masb: array of string;
  s: string;
  CurrentChar: Char;
begin
  iArr := 0;
  s:=Memo1.Text; // вместо того, чтобы на каждом витке цикла обращаться к Memo1.Text, используем его только 1 раз.
  SetLength(masb, Memo1.Lines.Count);

  for iPos:=1 to Length(s) do // пошли проходить по всему тексту
    begin
      CurrentChar:=s[iPos];
      if CurrentChar in ['0'..'9'] then
        masb[iArr]:=masb[iArr]+CurrentChar
      else
        if Length(masb[iArr])<>0 then
          Inc(iArr);
    end;
  // убрал строчки с переменной "x" - они бессмысленны.
end;


В разделе "Для новичков" сложно объяснить, почему возникает исключение Out of memory, но попробую.
Каждый раз, когда идет обращение к Memo1.Text[i], программа запрашивает полное содержимое Memo. Само собой, на это выделяется память. А вот освободится память только тогда, когда произойдет выход из события. Получается, что на каждом витке цикла у Вас в коде происходит куча выделений памяти под дубликаты Memo1.Text, а так как выхода из процедуры всё нет и нет, то они, накапливаясь, исчерпывают доступную для программы память.

Добавлено @ 20:54
Небольшой совет в дополнение - при оформлении кода пользуйтесь отступами для каждого уровня вложенности. Ваш код читать крайне неудобно.

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


Бывалый
*


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

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



Большое спасибо, сейчас попробую.
PM MAIL   Вверх
valerchi
Дата 14.8.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Выдаёт ошибку. Я так понял у меня почему-то изменяется объём массива, хотя я записал его так: 
Код

masb:array[0..50000] of string;
 а при работе программы он меняется. Может потому, что у меня числа в каждой строке memo по 6 штук:
Код

33 10 14 50 11 26
14 35 05 19 30 04
12 05 20 26 19 15
12 27 31 07 06 44
28 32 24 51 04 22
28 52 07 10 47 05
14 09 43 10 33 02
...............

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


Бывалый
*


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

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



Я разобрался, ещё раз спасибо. Это динамический массив, а в этой строке: "SetLength(masb, Memo1.Lines.Count);" определяется длина массива и она тут установлена на количество строк в Memo1, а именно: " Memo1.Lines.Count"

Это сообщение отредактировал(а) valerchi - 4.10.2011, 10:54
PM MAIL   Вверх
Zorak
Дата 14.8.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пометь вопрос решенным


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
Akella
Дата 15.8.2011, 06:50 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Меня (и не только меня) всегда немного удивляли такие вот люди.
Задал вопрос, потом неизвестно как решил и написал:
- Всё, я решил проблему.

А как, хрен его знает. Через день будет другой такой же искать ответ на похожий вопрос. Наверняка ему было бы интересно узнать, как именно решил. Но нет же, фиг ему. Пусть сам ищет, пусть создает новую тему! Круто...
PM MAIL   Вверх
valerchi
Дата 4.10.2011, 10:48 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Akella @ 15.8.2011,  06:50)
Меня (и не только меня) всегда немного удивляли такие вот люди.
Задал вопрос, потом неизвестно как решил и написал:
- Всё, я решил проблему.

А как, хрен его знает. Через день будет другой такой же искать ответ на похожий вопрос. Наверняка ему было бы интересно узнать, как именно решил. Но нет же, фиг ему. Пусть сам ищет, пусть создает новую тему! Круто...

Зачем что-то писать, если главное понятно.

Добавлено через 1 минуту и 18 секунд
Как мне пометить, что вопрос решённый? Поставить галочку и всё?
PM MAIL   Вверх
bems
Дата 6.10.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



kami, где ты говоришь накапливаются дубликаты строки?


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

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

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

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

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


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

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


 




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


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

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