-
Здравствуйте,
Мне надо в коде программы захардкодить, так сказать, таблицу соответствия.
Таблица примерно такая: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 -
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]не успел
-
> 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; -
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;
а заполнять при инициализации приложения... -
> Palladin
Ты это для меня сейчас написал, да? Благодарю, круто, только ну его нафиг, я лучше цикл из 3х строк оставлю :). -
Стыдно даже столько кода пропадает :(
-
Palladin © (09.04.08 18:37) [12]мне все равно делать нечего... писать то 7-10 минут... да и зря он не пропадет, думаю тем кто сюда заглянет, он будет полезен...
-
> // умру писать полное название
Убью за непонятное сокращение. :) -
Игорь Шевченко © (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 там не нужен.