-
Здравствуйте, Мне надо в коде программы захардкодить, так сказать, таблицу соответствия. Таблица примерно такая: 1, 2 соотвтетствуют 3.167
2, 6 соотвтетствуют 6.453 То есть в строке таблицы есть три числа. Дава целы ключи и одно с плавающей точкой значение. Вопрос как это записать в коде? Я подумал, что логично использовать для строк таблицы запись вида: TRec =
FA, FB: Integer;
FValue: Double;
end; А в качестве самой таблицы статитечский массив. Заполнить такой массив не в ран тайме не знаю. С массивом Integer проблем нет: Table: array[0Գ] of Integer = (0, 1); Вопросы: Как правильно сделать то, что я хочу? Если действительно удобно использовать стат массив, то как его записать?
-
> 0?
0Գ = 0
1
-
открываем справочку, идем в index и ищем пунктик "Record constants"
-
ну как-то так const Table: array[...] of TRec = ( (FA: 1; FB: 2; FValue: 3.167), ... );
PS. я бы не добавлял F к полям структуры
-
(FA: 1; FB: 2; Value: 3.167),
-
не успел
-
> Record constants
Насилу нашел плохой хелп.
Благодарю, разобрался.
-
> PS. я бы не добавлял F к полям структуры
Согласен. Так получилось: SamplingFrequencyTable: array[0Գ] of TSamplingFrequencyCorrespondence =
(
(DeviceType: $0103; DeviceVersion: $0500; SamplingFrequency: 97656.25/2;),
(DeviceType: $0104; DeviceVersion: $0300; SamplingFrequency: 97656.25;)
);
-
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;
-
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; а заполнять при инициализации приложения...
-
> Palladin
Ты это для меня сейчас написал, да? Благодарю, круто, только ну его нафиг, я лучше цикл из 3х строк оставлю :).
-
Стыдно даже столько кода пропадает :(
-
мне все равно делать нечего... писать то 7-10 минут... да и зря он не пропадет, думаю тем кто сюда заглянет, он будет полезен...
-
> // умру писать полное название
Убью за непонятное сокращение. :)
-
> m_theItems:TStringList;
Сишников давить!
-
так параноидально подробно то тоже называть не нужно
TSamplingFrequencyCorrespondence TSamplingFreqMapItem
уже проще...
Map - карта соответствий, термин Map из Java, у них там есть класс элементов ключ - значение, очень удобно его использовать в названиях...
MapItem - элемент карты соответствий...
-
> Игорь Шевченко © (09.04.08 18:49) [14]
:)
я далеко не сишник,
1. понижения видимости аттрибутов и методов в D6 нет, скрыть лишний функционал наследованием не получится, приходится использовать агрегацию 2. а захочу поменяю на другой класс и программист-пользователь даже не заметит. 3. чем тебе эта разновидность "Стратегии" не нравится?
-
> Игорь Шевченко © (09.04.08 18:49) [14]
аааа... дошло... :))) это ты из-за префикса меня придавить собрался...
-
Palladin © (09.04.08 18:59) [16]
> я далеко не сишник,
Это ты прокурору будешь рассказывать. Начинать имена private-полей с m_ - это сразу выдает латентного сишника или C#-ника. Кроме того, такой зоопарк названий (в VCL одно, в прикладном коде другое) сильно и ненужно нагружает голову.
-
Сишники не пишут кейводы с большой буквы, нету там таких кейвордов. И префикс T там не нужен.
-
И вообще не сишниковское дело контейнеры изобретать.
-
> уже проще
Согласен. Не пришло в голову.
> я далеко не сишник,
Да Паладин вообще оформляет код особым образом, помню спорили остался при своем мнении :)
-
> Начинать имена 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 только для переменные и в сокращенном виде ) он оформления не касается... хотите доводов по оформлению? их есть у меня. по желанию выскажусь.
-
Palladin © (09.04.08 20:00) [22]
> этот кусочек моего code convetion только для переменные > и в сокращенном виде ) он оформления не касается... хотите > доводов по оформлению? их есть у меня. по желанию выскажусь. >
Видишь ли, у Борланда тоже есть code conventions, и у этих conventions есть одна приятная особенность - они более распространены. Следовательно легче читаются и воспринимаются. Когда человек пишет для себя или для узкого круга лиц - проблем нету, когда эти conventions выходят наружу вот тут и начинается ступор восприятия. Будь подобный код написан на .Net-овском языке, я б слова не сказал - там они все с m_ начинаются. А по собственному опыту - заниматься, пытаясь понять логику программы, переводом чужой конвенции в привычную - это делать двойную работу. Какими бы благими намерениями не была выстлана чужая конвенция.
-
> Игорь Шевченко © (09.04.08 20:56) [23]
Ну это уже другая опера. Convensions борланда это ее. Пришел в мою команду - будь добр постигни мою. Я приду в другую команду подчиненным - постигну их правила. Приду ведущим - гляну на состяние дел и либо оставлю текущие, либо, если все жестоко требует рефакторинга, переведу на свои. Многие соглашаются, что они энергономичней (по моему так пишется :) )и оптимальней как при работе в среде так и самодокументировании. Ну а зоопарк. Не знаю. Благодаря этому зоопарку я вижу где мое, а где нет.
-
Palladin © (09.04.08 21:15) [24]
> Пришел в мою команду - будь добр постигни мою.
А скажи, если Delphi чего сгенерирует по Code Completion, ты тоже на свой лад потом переписываешь ?
Много лет я писал if foo then begin - старая сишная привычка, даже основание имелось для такого написания - строчек меньше выходит. С тех пор, как перешел на D2006, пишу if foo then begin
ПОТОМУ ЧТО ОНО МНЕ САМО ПРЕДЛАГАЕТ. А исправлять за сгенерированным - нунафиг, есть более интересные занятия.
-
Я конечно понимаю, что это все религия, но тем не менее :)
-
) ну так это сразу понятно было, что религия началась... а по поводу
> А скажи, если Delphi чего сгенерирует по Code Completion, ты тоже на свой лад потом переписываешь ?
Смотря что она генерирует. Модули форм я не трогаю. Как сгенерило так сгенерило. Мухи отдельно котлеты отдельно. Т.е., опять же, при возврате в прошлое по прошествии времени, прекрасно видно, что среда, а что я. Как completion генерирует по Ctrl-Alt-C меня не устраивает, потому не пользуюсь. Соответственно отключу все остальные нововведения completion'а в среде, выше чем d8... вот только мучают меня сильные сомнения в необходимости ухода с d6 выше чем d7...
Я не написал ни одной серьезной программы на другом ЯВУ и семейству Turbo паскаля посвятил всю свою жизнь. Больно видеть как все особенности и изюминки этого семейства расстворяются в создаваемом ширпотребе для армии посредственностей...
Посмотрим что наваяет cg. Пока не впечатляет...
-
Palladin © (09.04.08 23:17) [27]
> Больно видеть как все особенности и изюминки этого семейства > расстворяются в создаваемом ширпотребе для армии посредственностей. > ..
Тут я с тобой сильно не согласен, потому что среда с каждым выпуском (исключая D2005) делает работу программиста более удобной, избавляя его от рутинной работы. Мне удобно, когда код частично формируется за меня, избавляя от необходимости писать сначала объявление свойства в классе, а потом его реализацию, пусть даже простым копированием - я на эти действия не трачу времени.
А посредственности, поверь, могут на любом языке писать.
> Я не написал ни одной серьезной программы на другом ЯВУ
У меня разнообразие языков было несколько больше, но я не видел среды, аналогичной Delphi, где можно было бы с той же степенью удобства реализовывать свои замыслы. Может, я прошел мимо Visual Basic'а - говорят, там тоже удобно.
-
> Игорь Шевченко (10.04.2008 00:12:28) [28]
Там пожалуй удобнее, я радовался когда свой сайт писал для ASP.NET
|