Конференция "Начинающим" » Как заполнить статический массив записей.
 
  • 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 там не нужен.
  • guav © (09.04.08 19:19) [20]
    И вообще не сишниковское дело контейнеры изобретать.
  • Kolan © (09.04.08 19:20) [21]
    > уже проще…

    Согласен. Не пришло в голову.


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

    Да Паладин вообще оформляет код особым образом, помню спорили — остался при своем мнении :)
  • Palladin © (09.04.08 20:00) [22]

    > Начинать имена private-полей с m_ - это сразу выдает латентного сишника

    да да. а упражнение: стоя коснутся пальцами рук пальцев ног, выполненного мужчиной сразу выдает в нем латентного гомосексуала.

    В моем code convention существует четкое разделение идентификаторов на категории:
    1 private и protected члены класса m_
    2 параметры процедур/функций/методов p_
    3 локальные для процедур/функций/методов (без префиксов)
    4 глобальные g_
    Зачем мне это нужно и почему это так:
    Есть такая вещь в IDE - Code completion, так вот, дабы обратится не суть помня полное название например приватного члена класса мне достаточно набрать m_ и нажать Ctrl-Space. Я вижу все доступные приватные члены класса. В отличии от боландовского F, кода вылезе все что на F. А на кой мне этот поток мусора?
    Нужен параметр функции - набирать который долго. Та же операция p_

    Второй момент: Я четко вижу, в методе передается параметрами два идентификатора, значения которых я должен приравнять к private или protected членам класса вот и пишем

    m_nVar1:=p_nVar1;
    m_strVar2:=p_strVar2;



    позже возвращаясь к этому коду я сразу моментально для себя делаю вывод, ага, идет назначение приватным членам класса значений переданных параметрами. А не: мля!!!! чего же я тут кому присвоил то!!! и не лезу по Ctrl-Click по всем переменным, где же они объявлены то...

    все эти категории обеспечивают наиболее лаконичную самодокументацию кода...

    этот кусочек моего code convetion только для переменные и в сокращенном виде ) он оформления не касается... хотите доводов по оформлению? их есть у меня. по желанию выскажусь.
  • Игорь Шевченко © (09.04.08 20:56) [23]
    Palladin ©   (09.04.08 20:00) [22]


    > этот кусочек моего code convetion только для переменные
    > и в сокращенном виде ) он оформления не касается... хотите
    > доводов по оформлению? их есть у меня. по желанию выскажусь.
    >


    Видишь ли, у Борланда тоже есть code conventions, и у этих conventions есть одна приятная особенность - они более распространены. Следовательно легче читаются и воспринимаются. Когда человек пишет для себя или для узкого круга лиц - проблем нету, когда эти conventions выходят наружу вот тут и начинается ступор восприятия. Будь подобный код написан на .Net-овском языке, я б слова не сказал - там они все с m_ начинаются.
    А по собственному опыту - заниматься, пытаясь понять логику программы, переводом чужой конвенции в привычную - это делать двойную работу.
    Какими бы благими намерениями не была выстлана чужая конвенция.
  • Palladin © (09.04.08 21:15) [24]

    > Игорь Шевченко ©   (09.04.08 20:56) [23]

    Ну это уже другая опера. Convensions борланда это ее. Пришел в мою команду - будь добр постигни мою. Я приду в другую команду подчиненным - постигну их правила. Приду ведущим - гляну на состяние дел и либо оставлю текущие, либо, если все жестоко требует рефакторинга, переведу на свои. Многие соглашаются, что они энергономичней (по моему так пишется :) )и оптимальней как при работе в среде так и самодокументировании.
    Ну а зоопарк. Не знаю. Благодаря этому зоопарку я вижу где мое, а где нет.
  • Игорь Шевченко © (09.04.08 21:52) [25]
    Palladin ©   (09.04.08 21:15) [24]


    > Пришел в мою команду - будь добр постигни мою.


    А скажи, если Delphi чего сгенерирует по Code Completion, ты тоже на свой лад потом переписываешь ?

    Много лет я писал if foo then begin - старая сишная привычка, даже основание имелось для такого написания - строчек меньше выходит. С тех пор, как перешел на D2006, пишу
    if foo then
    begin

    ПОТОМУ ЧТО ОНО МНЕ САМО ПРЕДЛАГАЕТ. А исправлять за сгенерированным - нунафиг, есть более интересные занятия.
  • Игорь Шевченко © (09.04.08 21:52) [26]
    Я конечно понимаю, что это все религия, но тем не менее :)
  • Palladin © (09.04.08 23:17) [27]
    ) ну так это сразу понятно было, что религия началась...
    а по поводу


    > А скажи, если Delphi чего сгенерирует по Code Completion, ты тоже на свой лад потом переписываешь ?

    Смотря что она генерирует. Модули форм я не трогаю. Как сгенерило так сгенерило. Мухи отдельно котлеты отдельно. Т.е., опять же, при возврате в прошлое по прошествии времени, прекрасно видно, что среда, а что я. Как completion генерирует по Ctrl-Alt-C меня не устраивает, потому не пользуюсь. Соответственно отключу все остальные нововведения completion'а в среде, выше чем d8... вот только мучают меня сильные сомнения в необходимости ухода с d6 выше чем d7...

    Я не написал ни одной серьезной программы на другом ЯВУ и семейству Turbo паскаля посвятил всю свою жизнь. Больно видеть как все особенности и изюминки этого семейства расстворяются в создаваемом ширпотребе для армии посредственностей...

    Посмотрим что наваяет cg. Пока не впечатляет...
  • Игорь Шевченко © (10.04.08 00:12) [28]
    Palladin ©   (09.04.08 23:17) [27]


    > Больно видеть как все особенности и изюминки этого семейства
    > расстворяются в создаваемом ширпотребе для армии посредственностей.
    > ..


    Тут я с тобой сильно не согласен, потому что среда с каждым выпуском (исключая D2005) делает работу программиста более удобной, избавляя его от рутинной работы. Мне удобно, когда код частично формируется за меня, избавляя от необходимости писать сначала объявление свойства в классе, а потом его реализацию, пусть даже простым копированием - я на эти действия не трачу времени.

    А посредственности, поверь, могут на любом языке писать.


    > Я не написал ни одной серьезной программы на другом ЯВУ


    У меня разнообразие языков было несколько больше, но я не видел среды, аналогичной Delphi, где можно было бы с той же степенью удобства реализовывать свои замыслы. Может, я прошел мимо Visual Basic'а - говорят, там тоже удобно.
  • Anatoly Podgoretsky © (10.04.08 00:20) [29]
    > Игорь Шевченко  (10.04.2008 00:12:28)  [28]

    Там пожалуй удобнее, я радовался когда свой сайт писал для ASP.NET
 
Конференция "Начинающим" » Как заполнить статический массив записей.
Есть новые Нет новых   [134435   +34][b:0][p:0.002]