Конференция "Начинающим" » Как заполнить статический массив записей.
 
  • Kolan © (09.04.08 16:22) [0]
    Здравствуйте,
     Мне надо в коде программы захардкодить, так сказать, таблицу соответствия.
     Таблица примерно такая:
     1, 2 соотвтетствуют 3.167
     2, 6 соотвтетствуют 6.453



    То есть в строке таблицы есть три числа. Дава целы — ключи и одно с плавающей точкой — значение.

    Вопрос как это записать в коде?

    Я подумал, что логично использовать для строк таблицы запись вида:
    TRec =
     FA, FB: Integer;
     FValue: Double;
    end;



    А в качестве самой таблицы статитечский массив.

    Заполнить такой массив не в ран тайме не знаю.

    С массивом Integer проблем нет:
    Table: array[0&#1331] of Integer = (0, 1);



    Вопросы:
     Как правильно сделать то, что я хочу?
     Если действительно удобно использовать стат массив, то как его записать?
  • Kolan © (09.04.08 16:24) [1]
    > 0?

    0Գ = 0… 1
  • Palladin © (09.04.08 16:25) [2]
    открываем справочку, идем в index и ищем пунктик "Record constants"
  • clickmaker © (09.04.08 16:26) [3]
    ну как-то так
    const Table: array[...] of TRec = (
    (FA: 1; FB: 2; FValue: 3.167),
    ...
    );

    PS. я бы не добавлял F к полям структуры
  • zorik © (09.04.08 16:28) [4]
    (FA: 1; FB: 2; Value: 3.167),
  • zorik © (09.04.08 16:30) [5]
    не успел
  • Kolan © (09.04.08 16:46) [6]
    > Record constants

    Насилу нашел — плохой хелп.

    Благодарю, разобрался.
  • Kolan © (09.04.08 16:46) [7]
    > PS. я бы не добавлял F к полям структуры

    Согласен. Так получилось:
     SamplingFrequencyTable: array[0&#1331] of TSamplingFrequencyCorrespondence =
     (
       (DeviceType: $0103; DeviceVersion: $0500; SamplingFrequency: 97656.25/2;),
       (DeviceType: $0104; DeviceVersion: $0300; SamplingFrequency: 97656.25;)
     );

  • Kolan © (09.04.08 18:12) [8]
    TDeviceType =
     (
       dtDXS = $0103, {ДХС — что это значит не знает даже тот кто придумал эту аббривеатуру.}
       dtDPS = $0104  {ДПС — анналогично.}
     );

     {Строка таблицы соответствия частоты дискретизации типу и версии.}
     TSamplingFrequencyCorrespondence = record
       DeviceType: TDeviceType;
       DeviceVersion: Word;
       SamplingFrequency: Double;
     end;
    const
     {Таблица соответствия частоты дискретизации типу и версии.}
     SamplingFrequencyTable: array[0Գ] of TSamplingFrequencyCorrespondence =
     (
       (DeviceType: dtDXS; DeviceVersion: $0500; SamplingFrequency: 97656.25/2;),
       (DeviceType: dtDPS; DeviceVersion: $0300; SamplingFrequency: 97656.25;)
     );

    Интересно а можно объявить этот массив так, чтобы можно было получать третий параетр напрямую, а не писать функцию поиска с циклом?
    То есть как то так: A :=  SamplingFrequencyTable[dtDPS, $0300];
    A = 97656.25;
  • Palladin © (09.04.08 18:27) [9]
    Type
    TDeviceType =
    (
      dtDXS = $0103, {ДХС — что это значит не знает даже тот кто придумал эту аббривеатуру.}
      dtDPS = $0104  {ДПС — анналогично.}
    );

    TSamplingFrequencyCorrespondence = record
      DeviceType: TDeviceType;
      DeviceVersion: Word;
      SamplingFrequency: Double;
    end;

    PSFC=^TSFC;
    TSFC=TSamplingFrequencyCorrespondence; // умру писать полное название

    TSFCList=Class
    Private
     m_theItems:TStringList;

     Function lcGetCount:Integer;
     Function lcGetItem(p_nIndex:Integer):PSFC;
     Function lcGetItemBy(p_etDevType:TDeviceType;p_nVer:Word):Double;
    Public
     Constructor Create;
     Destructor Destroy; Override;

     Property Count:Integer Read lcGetCount;
     Property ByTypeAndVer[etDevType:TDeviceType;nVer:Word]:Double Read lcGetItemBy; Default;
     Property Items[nIndex:Integer]:PSFC Read lcGetItem;

     Function Add(p_rSFC:TSFC):Integer; Overload;
     Function Add(p_rSFC:PSFC):Integer; Overload;
     Procedure Delete(p_nIndex:Integer);
     Procedure Clear;
    End;

    Function TSFCList.lcGetCount;
    Begin
    Result:=m_theItems.Count;
    End;

    Function TSFCList.lcGetItem;
    Begin
    Result:=PSFC(m_theItems.Objects[p_nIndex]);
    End;

    Function TSFCList.lcGetItemBy;
    Var
    n:Integer;
    Begin
    If Not m_theItems.Find(IntToStr(Integer(p_etDevType))+#9+IntToStr(p_nVer),n)
     Then Raise EListError.Create('а нету')
     Else Result:=Items[n].SamplingFrequency;
    End;

    Constructor TSFCList.Create;
    Begin
    m_theItems:=TStringList.Create;
    m_theItems.Sorted:=True;
    End;

    Destructor TSFCList.Destroy;
    Begin
    Clear;
    m_theItems.Free;
    End;

    Function TSFCList.Add(p_rSFC:TSFC):Integer;
    Var
    r:PSFC;
    Begin
    New(r);
    r^:=p_rSFC;
    Result:=Add(r);
    End;

    Function TSFCList.Add(p_rSFC:PSFC):Integer;
    Var
    s:String;
    Begin
    With p_rSFC^ Do s:=IntToStr(Integer(DeviceType))+#9+IntToStr(DeviceVersion);
    If m_theItems.IndexOf(s)<>-1
     Then Raise EListError.Create('а уже есть')
     Else Result:=m_theItems.AddObject(s,TObject(p_rSFC));
    End;

    Procedure TSFCList.Delete;
    Begin
    Dispose(PSFC(m_theItems.Objects[p_nIndex]));
    m_theItems.Delete(p_nIndex);
    End;

    Procedure TSFCList.Clear;
    Begin
    While m_theItems.Count<>0 Do Delete(0);
    End;



    а заполнять при инициализации приложения...
  • Kolan © (09.04.08 18:30) [10]
    > Palladin

    Ты это для меня сейчас написал, да? Благодарю, круто, только ну его нафиг, я лучше цикл из 3х строк оставлю :).
  • Kolan © (09.04.08 18:31) [11]
    Стыдно даже столько кода пропадает :(…
  • Palladin © (09.04.08 18:37) [12]
    мне все равно делать нечего... писать то 7-10 минут... да и зря он не пропадет, думаю тем кто сюда заглянет, он будет полезен...
  • Kolan © (09.04.08 18:40) [13]
    > // умру писать полное название

    Убью за непонятное сокращение. :)
  • Игорь Шевченко © (09.04.08 18:49) [14]

    >  m_theItems:TStringList;


    Сишников давить!
  • Palladin © (09.04.08 18:56) [15]
    так параноидально подробно то тоже называть не нужно

    TSamplingFrequencyCorrespondence
    TSamplingFreqMapItem

    уже проще...

    Map - карта соответствий, термин Map из Java, у них там есть класс элементов ключ - значение, очень удобно его использовать в названиях...

    MapItem - элемент карты соответствий...
  • Palladin © (09.04.08 18:59) [16]

    > Игорь Шевченко ©   (09.04.08 18:49) [14]

    :)

    я далеко не сишник,

    1. понижения видимости аттрибутов и методов в D6 нет, скрыть лишний функционал наследованием не получится, приходится использовать агрегацию
    2. а захочу поменяю на другой класс и программист-пользователь даже не заметит.
    3. чем тебе эта разновидность "Стратегии" не нравится?
  • Palladin © (09.04.08 19:04) [17]

    > Игорь Шевченко ©   (09.04.08 18:49) [14]

    аааа... дошло... :))) это ты из-за префикса меня придавить собрался...
  • Игорь Шевченко © (09.04.08 19:06) [18]
    Palladin ©   (09.04.08 18:59) [16]


    > я далеко не сишник,


    Это ты прокурору будешь рассказывать. Начинать имена private-полей с m_ - это сразу выдает латентного сишника или C#-ника. Кроме того, такой зоопарк названий (в VCL одно, в прикладном коде другое) сильно и ненужно нагружает голову.
  • guav © (09.04.08 19:13) [19]
    Сишники не пишут кейводы с большой буквы, нету там таких кейвордов. И префикс T там не нужен.
 
Конференция "Начинающим" » Как заполнить статический массив записей.
Есть новые Нет новых   [134435   +34][b:0][p:0.002]