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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2007, 10:40   #1
alexei
Новичок
Джуниор
 
Регистрация: 11.09.2007
Сообщений: 2
По умолчанию Помогите новичку с массивами

Добрый день.
Вопрос в следующем: подскажите, как во время работы программы создать несколько доп. массивов, размер которых заранее не известен. В var же не возможно описать все, с чем можно столкнуться.

P.S.: если можно, то желательно на примере. И еще, поделитесь ссылками на библиотеки по работе с матрицами, чтобы самому не писать коды по сложению, умножению матриц и т.д.

Заранее спасибо.
alexei вне форума Ответить с цитированием
Старый 11.09.2007, 10:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну мона воспользоваться типом Variant :
Создать в нем массив мона так (из Хелпа)
var

A: Variant;
begin
A := VarArrayCreate([0, 4], varinteger);
A[0] := 1;
A[1] := 1234.5678;

end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2007, 11:20   #3
alexei
Новичок
Джуниор
 
Регистрация: 11.09.2007
Сообщений: 2
По умолчанию

А если массивов несколько и их количество заранее не известно, а в какой-то момент времени надо будет произвести какие-то операции с вновь созданными (сколько не известно начале работы программы) матрицами?
alexei вне форума Ответить с цитированием
Старый 11.09.2007, 11:24   #4
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Создавай массив указателей тогда и храни там ссылки на вновь созданные
Ring0Sn вне форума Ответить с цитированием
Старый 11.09.2007, 11:54   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Совсем необязательно работать с указателями
Есди заглянеш в хелп то увидиш там такой примерчик :

var

A: Variant;
begin
A := VarArrayCreate([0, 4], varVariant);
A[0] := 1;
A[1] := 1234.5678;
A[2] := 'Hello world';
A[3] := True;
A[4] := VarArrayOf([1, 10, 100, 1000]); // Это создание массива в элементе №4.
WriteLn(A[2]); { Hello world }
WriteLn(A[4][2]); { 100 }
end;

Вообще Variant штука весьма полезная. ты можеш в любой момент создавать дополнительные массивы в контексте главного или удалять ненужные элементы без особых проблем
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2007, 13:42   #6
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Вообще Variant штука весьма полезная
Правда ? а я так несчитаю в плане производительсти и оптимальности...
Смотрим внутрь Varianta
Код:
struct tagVARIANT          
{                          
  union                    // Объединение для типа decimal
  {                        
    struct __tagVARIANT    
    {                      
      VARTYPE vt;          // поле, определяющее хранимый тип (VT_-тип)
      WORD wReserved1;     
      WORD wReserved2;     
      WORD wReserved3;     
      union                
      {                    
                               //  VT_-тип (С/C++)            Тип VB
        LONGLONG llVal;        //  VT_I8                     н/п
        LONG lVal;             //  VT_I4                     ByVal Long
        BYTE bVal;             //  VT_UI1                    ByVal Byte
        SHORT iVal;            //  VT_I2                     ByVal Integer
        FLOAT fltVal;          //  VT_R4                     ByVal Single
        DOUBLE dblVal;         //  VT_R8                     ByVal Double
        VARIANT_BOOL boolVal;  //  VT_BOOL                   ByVal Boolean
        _VARIANT_BOOL bool;    //                            --
        SCODE scode;           //  VT_ERROR                  Missing
        CY cyVal;              //  VT_CY                     ByVal Currency
        DATE date;             //  VT_DATE                   ByVal Date
        BSTR bstrVal;          //  VT_BSTR                   ByVal String
        IUnknown *punkVal;     //  VT_UNKNOWN                ByVal Object
        IDispatch *pdispVal;   //  VT_DISPATCH               ByVal Object
        SAFEARRAY *parray;     //  VT_ARRAY | *              Массив
                               //                            (без типа н/п)
        BYTE *pbVal;           //  VT_BYREF|VT_UI1           ByRef Long
        SHORT *piVal;          //  VT_BYREF|VT_I2            ByRef Byte
        LONG *plVal;           //  VT_BYREF|VT_I4            ByRef Integer
        LONGLONG *pllVal;      //  VT_BYREF|VT_I8            ByRef Single
        FLOAT *pfltVal;        //  VT_BYREF|VT_R4            ByRef Double
        DOUBLE *pdblVal;       //  VT_BYREF|VT_R8            ByRef Boolean
        VARIANT_BOOL *pboolVal;//  VT_BYREF|VT_BOOL          ByRef Boolean
        _VARIANT_BOOL *pbool;                             
        SCODE *pscode;         //  VT_BYREF|VT_ERROR         н/п
        CY *pcyVal;            //  VT_BYREF|VT_CY            ByRef Currency
        DATE *pdate;           //  VT_BYREF|VT_DATE          ByRef Date
        BSTR *pbstrVal;        //  VT_BYREF|VT_BSTR          ByRef String
        IUnknown **ppunkVal;   //  VT_BYREF|VT_UNKNOWN       ByRef Object
        IDispatch **ppdispVal; //  VT_BYREF|VT_DISPATCH      ByRef Object
        SAFEARRAY **pparray;   //  VT_BYREF|VT_ARRAY         ByRef Массив 
                               //                            (без типа н/п)
        VARIANT *pvarVal;      //  VT_BYREF|VT_VARIANT       ByRef Variant
        PVOID byref;           //  VT_BYREF (Generic ByRef)  н/п
        CHAR cVal;             //  VT_I1                     н/п
        USHORT uiVal;          //  VT_UI2                    н/п
        ULONG ulVal;           //  VT_UI4                    н/п
        ULONGLONG ullVal;      //  VT_UI8                    н/п
        INT intVal;            //  VT_INT                    н/п
        UINT uintVal;          //  VT_UINT                   н/п
        DECIMAL *pdecVal;      //  VT_BYREF|VT_DECIMAL       Только в Variant-е
        CHAR *pcVal;           //  VT_BYREF|VT_I1            н/п
        USHORT *puiVal;        //  VT_BYREF|VT_UI2           н/п
        ULONG *pulVal;         //  VT_BYREF|VT_UI4           н/п
        ULONGLONG *pullVal;    //  VT_BYREF|VT_UI8           н/п
        INT *pintVal;          //  VT_BYREF|VT_INT           н/п
        UINT *puintVal;        //  VT_BYREF|VT_UINT          н/п
        struct __tagBRECORD    //  VT_RECORD (структура)     ByRef Type
        {                       
          PVOID pvRecord;      //  Указатель на структуру
          IRecordInfo *pRecInfo; // Описание структуры.
        }   __VARIANT_NAME_4; 
      }   __VARIANT_NAME_3;   
    }   __VARIANT_NAME_2;     
    DECIMAL decVal;           
  } __VARIANT_NAME_1;         
};
"Итого 16 байт вместе с union-ом. Находчивости программистов Microsoft можно только позавидовать, но, тем не менее, 16 байт – это большой перерасход места."
Ring0Sn вне форума Ответить с цитированием
Старый 11.09.2007, 14:20   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если в задаче не стоит пункт скорость, то Вариант удобнее всего.
Тем более современные компьютеры позволяют это удобство.
Впрочем всегда можно прибегнуть к старым добрым указателям или TList
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2007, 14:23   #8
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

[OFF][b]Stilet,[b] ты случаем не из ЗАО Касперского? ))
там тоже смотрю люди очень "находчивые" сидят и пишут ПО которое сжирает все ресурсы ))[/OFF]

Последний раз редактировалось Ring0Sn; 11.09.2007 в 14:28. Причина: НАдО_o
Ring0Sn вне форума Ответить с цитированием
Старый 11.09.2007, 14:24   #9
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если в задаче не стоит пункт скорость, то Вариант удобнее всего.
Ну если так то неспорю.

Последний раз редактировалось Ring0Sn; 11.09.2007 в 14:27.
Ring0Sn вне форума Ответить с цитированием
Старый 11.09.2007, 22:19   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

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

Цитата:
[OFF][b]Stilet,[b] ты случаем не из ЗАО Касперского? ))
класс
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с массивами пожалуйста neomaximus Помощь студентам 5 08.07.2008 17:48
Помогите с массивами в Делфи _Alise_ Помощь студентам 11 21.06.2008 22:17
помогите с массивами Ibmsystem Помощь студентам 1 21.04.2008 08:10
Помогите с массивами Юль_кА Паскаль, Turbo Pascal, PascalABC.NET 2 10.04.2008 08:39