Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.03.2013, 15:18
Qlimax Qlimax вне форума
Прохожий
 
Регистрация: 08.03.2013
Сообщения: 7
Репутация: 10
По умолчанию Двумерный динамический массив

такие пироги, подгрузка файла с данными,запись их в двумерный массив, затем вывод всего на StringGrid, но все идет через одно место, кое что набросал но не уверен,массив в файле по идеи 200 на 200, то бишь 40000 значений,но может и меняться,еще хотел попросить помощи в заполнении массива не с начала данных а скажем с 5 строчки.
Код:
var
  Form1: TForm1;
  Mass: array of array of real;





procedure TForm1.BitBtn1Click(Sender: TObject);
var
F : textfile;
i,j,m,n : integer;
begin
if OpenDialog1.Execute then

  AssignFile(f,OpenDialog1.FileName);
  RESET(F);
  SetLength(mass,m,n);
  I:=0 ;
  j:=0;
  i := 0;
  while not Eof(f) do begin
    Inc(i);
    SetLength(mass, i + 1);
    j:= 0;
    while not Eoln(f) do begin
      Inc(j);
      SetLength(mass[i], j + 1);
      Read(f, mass[i, j]);
    end;
    ReadLn(f);

  end;
  CloseFile(f);

For i:=1 to m-1 do
For j:=1 to n-1 do
    begin

      StringGrid1.Cells[i,j]:=floattostr(mass[i,j]);
    end;
end;

end.
Ответить с цитированием
  #2  
Старый 08.03.2013, 16:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Qlimax
...кое что набросал но не уверен...
Переменные m и n изначально нулевые, не задаются. Можно это брейком проверить. m скорее всего должна иметь значение кол-ва строчек в загруженном текстовом файле, а n - фикс. число данных в строке, грузить наверное надо циклом, по разделителю. И возможно, массив здесь получается лишним, можно сразу данные в StringGrid из файла загружать.
Ответить с цитированием
  #3  
Старый 08.03.2013, 17:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Проще кинуть рабочий код, чем описывать, что не так. Вот сравните:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 Mass: Array of Array of Real;
 F: TextFile;
 m,n: integer;
begin
 if not OpenDialog1.Execute then Exit;
 AssignFile(F, OpenDialog1.FileName);
 Reset(F);
 m := 0; n := 0;
 SetLength(Mass, m, n);
 while not Eof(F)
 do begin
    m := Length(Mass);
    SetLength(Mass, m + 1);
    while not EoLn(F)
    do begin
       n := Length(Mass[m]);
       SetLength(Mass[m], n + 1);
       Read(F, Mass[m, n]);
       end;
    ReadLn(f);
    end;
 CloseFile(f);
 StringGrid1.FixedCols := 0; StringGrid1.FixedRows := 0;
 StringGrid1.ColCount := 1; StringGrid1.RowCount := Length(Mass);
 for m := 0 to Length(Mass) - 1
 do begin
    if StringGrid1.ColCount < Length(Mass[m])
    then StringGrid1.ColCount := Length(Mass[m]);
    for n := 0 to Length(Mass[m]) - 1
    do StringGrid1.Cells[n, m] := FloatToStr(Mass[m,n]);
    end;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Qlimax (08.03.2013)
  #4  
Старый 08.03.2013, 17:31
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А что касается считывания с 5 строчки файла данных, то просто вызовите ReadLn(f) 5 раз перед началом заполнения массива и все.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 08.03.2013, 17:51
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Страдалецъ
...А что касается считывания с 5 строчки файла...
Наверное нужно использовать Seek(f,5);
Ответить с цитированием
  #6  
Старый 08.03.2013, 18:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Не, так не пойдет, это-же текстовый файл.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 08.03.2013, 17:31
Qlimax Qlimax вне форума
Прохожий
 
Регистрация: 08.03.2013
Сообщения: 7
Репутация: 10
По умолчанию

да,m и n это размер массива по идеи, в StringGrid хочу подгружать чтобы проверять правильность загрузки массива, меня больше интересует правильно ли он подгружаеться, еще в файле думаю указывать ряд значений, таких как размерность массива, можно ли сделать так чтобы он брал из файла размер массива, т.е. в 1 строчке написано допустим 200 200, он её считывает и создает массив 200 на 200, а со 2 строчки документа начинает заполнять его данными ?
Ответить с цитированием
  #8  
Старый 08.03.2013, 17:37
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Можно и так, но вообще хранить так данные как они у вас хранятся, очень непрактично. Даже простая операция перехода на нужную позицию данных в файле выглядит стрёмновато. Намного быстрее и эффективнее содать типизированный файл и работать уже с ним. Это и быстрее и удобнее.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 12.03.2013, 08:42
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Вот так сойдёт? Если оно ещё надо
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  F: System.Text;
  S : TStringList;
  Line: String;
begin
  if OpenDialog1.Execute and
     FileExists(OpenDialog1.FileName) then
  with StringGrid1 do
  try
    AssignFile(F, OpenDialog1.FileName);
    FileMode := 0;
    Reset(F);
    S := TStringList.Create;
    ColCount := 2;
    RowCount := 2;
    while not EOF(F) do
    begin
      ReadLn(F, Line);
      S.DelimitedText := IntToStr(RowCount-1) + ' ' + Line;
      ColCount := Max(ColCount, S.Count);
      Rows[RowCount-1] := S;
      RowCount := RowCount + 1;
    end; // while not EOF(F) do
  finally
    RowCount := RowCount - 1;
    S.Free;
    if TTextRec(F).Mode <> fmClosed then
      CloseFile(F);
  end; // try
end; // procedure TForm1.Button1Click(Sender: TObject)
Ответить с цитированием
  #10  
Старый 14.03.2013, 19:08
Qlimax Qlimax вне форума
Прохожий
 
Регистрация: 08.03.2013
Сообщения: 7
Репутация: 10
По умолчанию

в принципе надо, но задача маленько поменялась и я сам во всем уже запутался
Ответить с цитированием
  #11  
Старый 14.03.2013, 20:06
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Так вот же тебе накатал, читает из текстового файла в StringList любой(условно ) двумерный динамический массив, в текстовом файле размерность указывать не надо, просто ввести нужное количество строк, можно разной длины. Вот тебе файл для примера. А сейчас что надо?

Последний раз редактировалось BBBCat, 17.03.2013 в 00:07.
Ответить с цитированием
  #12  
Старый 14.03.2013, 23:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вот хорош конечно класс StringList, но когда вам надо обработать большой текстовый файл быстренько, вообще никуда не годится, пока он выделит память, пока считает... Простое доброе решение через ReadLn сделает тоже самое на порядок быстрее, так-что не всегда то что удобно - лучше.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 14.03.2013, 23:46
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Согласен, у меня есть примеры, когда кода много, но оно всё летает, а если использовать стандартные методы - тормозит. К тому же он сказал, что у него большие объёмы. Но мне показалось, что человек и так слегка теряется, а тут ещё если грузануть его большим кодом - вообще капец. Но по этой теме поступило несколько предложений, пусть выбирает, что ему лучше. Форум же

4 000 000 значений считывал 15 секунд. Не фонтан. Заявленые 40 000 - моментально.

Последний раз редактировалось BBBCat, 15.03.2013 в 00:19.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:07.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025