Форум по 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:31
Qlimax Qlimax вне форума
Прохожий
 
Регистрация: 08.03.2013
Сообщения: 7
Репутация: 10
По умолчанию

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

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

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

Не, так не пойдет, это-же текстовый файл.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 09.03.2013, 00:40
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Страдалецъ
...это-же текстовый файл.
Точно, забыл совсем, извнт.

Вот что получилось.
Вложения
Тип файла: zip sg.zip (2.1 Кбайт, 19 просмотров)
Ответить с цитированием
  #10  
Старый 09.03.2013, 11:05
Qlimax Qlimax вне форума
Прохожий
 
Регистрация: 08.03.2013
Сообщения: 7
Репутация: 10
По умолчанию

Страдалецъ, спасибо большое за помощь, но он катает все в одномерный массив ,смотрел пошагово он менять значение n а m оставляет таким же.

Alegun, благодарю за помощь, кое что вытащил для себя из твоей програмки но при попытке загрузить туда свой фал ругаться на меня) " invalid numeric input "
Ответить с цитированием
  #11  
Старый 09.03.2013, 11:31
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Qlimax
...при попытке загрузить туда свой фал ругаться на меня) " invalid numeric input "
Первые две строчки задают размерность (1-ая: 200, 2-ая: 200) а после них идут сами данные, нужно их добавить.
Ответить с цитированием
  #12  
Старый 09.03.2013, 12:02
Qlimax Qlimax вне форума
Прохожий
 
Регистрация: 08.03.2013
Сообщения: 7
Репутация: 10
По умолчанию

понял) спасибо) это отличный пример вывод на грид, но без записи в массив, а вывод в грид мне нужен чисто для проверки )
Ответить с цитированием
  #13  
Старый 09.03.2013, 12:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Qlimax
...вывод в грид мне нужен чисто для проверки )
Тогда вот так
Код:
 var
 Mass: Array of Array of Real;
procedure TForm1.Button2Click(Sender: TObject);
var
 f: TextFile;
 i,b,c,d: integer;
 str: string;
 begin
  AssignFile(f,OpenDialog1.FileName);
  Reset(f);
  Readln(f, c);
  Readln(f, d);
  SetLength(mass,c,d);
  for i:= 0 to c do for b:= 0 to d do
      begin
       Readln(f,str);
        mass[i,b]:= StrToFloat(str);
      end;
   CloseFile(f);
end;
Только всё равно нужно в файл размерность массива добавить.
Ответить с цитированием
  #14  
Старый 09.03.2013, 18:59
Qlimax Qlimax вне форума
Прохожий
 
Регистрация: 08.03.2013
Сообщения: 7
Репутация: 10
По умолчанию

тэк..поковырялся с кодом, понял что идет не так, массив в файле имеет вид:
1.0005 2.04 2.006 2.448 4.55 6.55
2.45 2.564 5.6541 3.2118 6.154 8.55
...
и т.д.
а программа понимает разделитель только энтер как я понял,как ей описать понятие пробела? и может проще писать в статический массив ибо как описать то что одна строка всего 200 значений? )
Ответить с цитированием
  #15  
Старый 12.03.2013, 01:04
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Qlimax
...программа понимает разделитель только энтер как я понял,как ей описать понятие пробела?...
Пример разбиения строки на отдельные слова.

З.Ы. Лучше поздно, чем никогда.
Вложения
Тип файла: zip parser.zip (1.7 Кбайт, 26 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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