Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2012, 09:41   #1
MasMaX
Новичок
Джуниор
 
Регистрация: 07.02.2012
Сообщений: 2
По умолчанию Несколько однотипных массивов

Здравствуйте. Помогите оптимизировать алгоритм программы. Суть следующая:
Имеется база данных (файловая), из этой базы информация считывается в массивы. Иногда в один массив, иногда (если выполяются условия) в несколько.

Начало примерно такое:
Код:
type
    TProduct = packed record
    kod: integer; 
    pname: string[30];
    ptype: integer; 
    otgr: array[0..20] of integer; 
    vozvr: array[0..20] of integer; 
    recom: array[0..20] of integer; 
    postav: array[0..20] of integer; 
  end;

var
    Stroki, Stroki_dop: array of TProduct;

while not Eof(Felik) do // Читаем весь файл
      begin
        ReadLn(Felik, n1); // Читаем строку

        fkod := StrToInt(GetField(n1, 1)); // Код
        fpname := GetField(n1, 3); // Название
        fptype := StrToInt(GetField(n1, 2)); // Тип
....// Здесь еще в массивы данные добавляются

        if (fptype = 31) or (prodsarr[fkod, 4] = '1') then
          begin
              SetLength(Stroki_dop, Length(Stroki_dop) + 1);
              Stroki_dop[i].kod := fkod;
              Stroki_dop[i].pname := fpname;
              Stroki_dop[i].ptype := fptype;
.... // Здесь еще в массивы данные добавляются
          end
          begin
              SetLength(Stroki, Length(Stroki) + 1);
              Stroki[i].kod := fkod;
              Stroki[i].pname := fpname;
              Stroki[i].ptype := fptype;
.... // Здесь еще в массивы данные добавляются
          end;
    end;
Затем выделяем из записей данные чтобы для ввода в Эксель:
Код:
    
    SetLength(main_arr, 0);
    SetLength(main_arr, Length(Stroki), 21);
    for i := 0 to Length(Stroki) - 1 do
      for j := 0 to Length(Stroki[j].recom) - 1 do
        main_arr[i, j] := Stroki[i].recom[j];

    if Length(Stroki_dop) <> 0 then
    begin
      SetLength(main_arr2, 0);
      SetLength(main_arr2, Length(Stroki_dop), 21);
      for i := 0 to Length(Stroki_dop) - 1 do
        for j := 0 to Length(Stroki_dop[j].recom) - 1 do
          main_arr2[i, j] := Stroki_dop[i].recom[j];
    end;
Затем массивы main_arr и main_arr2 выводятся к Эксель. Про сами записи Stroki мы при выводе тоже не забываем и берем часть данных из них.

Код:
 if l1 <> 0 then // Если есть первый массив
  begin
   XL.Range[XL.Cells[6, ss], XL.Cells[l1 + 5, l3 + ss - 1]].Select;
   XL.Selection := Variant(main_arr);
   XL.Selection.EntireColumn.Hidden := True;
  end;

  if l2 <> 0 then // Если есть второй массив
   begin
    XL.Range[XL.Cells[l1 + 8, ss], XL.Cells[l1 + l2 + 7, l3 + ss - 1]].Select;
    XL.Selection := Variant(main_arr2);
    XL.Selection.EntireColumn.Hidden := True;
  end;
Код я сильно урезал для форума, но суть такая. Могут существовать оба массива, либо только какой-то один из них.

Теперь появилась необходимость создать третий список. Можно конечно создать Stroki_dop2 аналогичного типа. Но если потом вдруг понадобится 4ый массив, то всё очень сильно вырастет.

Как здесь лучше оптимизировать код? После чтения из файла и вывода в Эексель еще не мало операций, поэтому писать сразу из файла в Эксель не получится.
MasMaX вне форума Ответить с цитированием
Старый 07.02.2012, 09:49   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, сделайте, например, односвязный список из указателей на array of TProduct
(тогда это позволит иметь НЕОГРАНИЧЕННОЕ число массивов.
или сделать динамический массив из динамических массивов:
Код:
var
  MyStroki : array of array of TProduct;
Либо, помня, что переменная типа array of TProduct - это просто указатель (и сама по себе памяти "кушает" крайне мало), то банально завести статический массив из массивов:
Код:
type
   TArrTProduct = array of TProduct
var
  MyStroki : array[1..20] of TArrTProduct;

p.s. писал прямо тут, возможны опечатки/ошибки...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2012, 10:17   #3
MasMaX
Новичок
Джуниор
 
Регистрация: 07.02.2012
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, сделайте, например, односвязный список из указателей на array of TProduct
(тогда это позволит иметь НЕОГРАНИЧЕННОЕ число массивов.
или сделать динамический массив из динамических массивов:
Код:
var
  MyStroki : array of array of TProduct;
Либо, помня, что переменная типа array of TProduct - это просто указатель (и сама по себе памяти "кушает" крайне мало), то банально завести статический массив из массивов:
Код:
type
   TArrTProduct = array of TProduct
var
  MyStroki : array[1..20] of TArrTProduct;
Спасибо. Пробуй сейчас, вроде получается создать массив массивов. Только немного не понятен вывод в Эксель.

Сам массив Stroki имеет вид:
(69, 'Торт 1', 6, (0, 0, 0, 0, 0, 3, ..., 3, ...)),
(90, 'Торт 2', 6, (0, 0, 0, 0, 0, 2, ..., 6, ...))...
и т.д.

Соотвественно массив из этой записи собирался в main_arr для дальнейшего вывода разом в Эксель. Можно конечно читать и выводить построчно, но строк бывает до 100 шт и вывод в Эксель очень тормозится.

Получался массив main_arr типа
((0, 0, 0, 0, 0, 3, ..., 3, ...), (0, 0, 0, 0, 0, 2, ..., 6, ...) (...), ....)

Или добавить main_arr ещё одно измерение? В данный момент он двухмерный (строки и столбцы в Эксель).
MasMaX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ 16 однотипных лаб chivi Фриланс 5 15.03.2011 23:25
Разделение массива на несколько массивов kpachbiu PHP 14 28.12.2010 16:03
Склеит несколько массивов в один Darunok Microsoft Office Excel 7 22.06.2010 20:35
Считать из файла несколько массивов pascalC Общие вопросы C/C++ 13 20.10.2008 21:16
Несколько очень легких задачек!проверьте себя!!на разные темы,от нах-я суммы до массивов!!прошу решить,кн ruslan55 Паскаль, Turbo Pascal, PascalABC.NET 3 17.06.2008 12:43