![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заполнить статический массив записей.
Kolan © (2008-04-09 16:22:00)Здравствуйте,
Мне надо в коде программы захардкодить, так сказать, таблицу соответствия.
Таблица примерно такая:
1, 2 соотвтетствуют 3.167
2, 6 соотвтетствуют 6.453
То есть в строке таблицы есть три числа. Дава целы ключи и одно с плавающей точкой значение.
Вопрос как это записать в коде?
Я подумал, что логично использовать для строк таблицы запись вида:
TRec =
FA, FB: Integer;
FValue: Double;
end;
А в качестве самой таблицы статитечский массив.
Заполнить такой массив не в ран тайме не знаю.
С массивом Integer проблем нет:
Table: array[0Գ] of Integer = (0, 1);
Вопросы:
Как правильно сделать то, что я хочу?
Если действительно удобно использовать стат массив, то как его записать?
Игорь Шевченко (2008-04-09 20:56:00) [21]Palladin © (09.04.08 20:00) [22]
> этот кусочек моего code convetion только для переменные
> и в сокращенном виде ) он оформления не касается... хотите
> доводов по оформлению? их есть у меня. по желанию выскажусь.
>
Видишь ли, у Борланда тоже есть code conventions, и у этих conventions есть одна приятная особенность - они более распространены. Следовательно легче читаются и воспринимаются. Когда человек пишет для себя или для узкого круга лиц - проблем нету, когда эти conventions выходят наружу вот тут и начинается ступор восприятия. Будь подобный код написан на .Net-овском языке, я б слова не сказал - там они все с m_ начинаются.
А по собственному опыту - заниматься, пытаясь понять логику программы, переводом чужой конвенции в привычную - это делать двойную работу.
Какими бы благими намерениями не была выстлана чужая конвенция.
Palladin (2008-04-09 20:00: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 только для переменные и в сокращенном виде ) он оформления не касается... хотите доводов по оформлению? их есть у меня. по желанию выскажусь.
Kolan (2008-04-09 19:20:00) [23]> уже проще
Согласен. Не пришло в голову.
> я далеко не сишник,
Да Паладин вообще оформляет код особым образом, помню спорили остался при своем мнении :)
guav (2008-04-09 19:19:00) [24]И вообще не сишниковское дело контейнеры изобретать.
guav (2008-04-09 19:13:00) [25]Сишники не пишут кейводы с большой буквы, нету там таких кейвордов. И префикс T там не нужен.
Игорь Шевченко (2008-04-09 19:06:00) [26]Palladin © (09.04.08 18:59) [16]
> я далеко не сишник,
Это ты прокурору будешь рассказывать. Начинать имена private-полей с m_ - это сразу выдает латентного сишника или C#-ника. Кроме того, такой зоопарк названий (в VCL одно, в прикладном коде другое) сильно и ненужно нагружает голову.
Palladin (2008-04-09 19:04:00) [27]
> Игорь Шевченко © (09.04.08 18:49) [14]
аааа... дошло... :))) это ты из-за префикса меня придавить собрался...
Palladin (2008-04-09 18:59:00) [28]
> Игорь Шевченко © (09.04.08 18:49) [14]
:)
я далеко не сишник,
1. понижения видимости аттрибутов и методов в D6 нет, скрыть лишний функционал наследованием не получится, приходится использовать агрегацию
2. а захочу поменяю на другой класс и программист-пользователь даже не заметит.
3. чем тебе эта разновидность "Стратегии" не нравится?
Palladin (2008-04-09 18:56:00) [29]так параноидально подробно то тоже называть не нужно
TSamplingFrequencyCorrespondence
TSamplingFreqMapItem
уже проще...
Map - карта соответствий, термин Map из Java, у них там есть класс элементов ключ - значение, очень удобно его использовать в названиях...
MapItem - элемент карты соответствий...
Игорь Шевченко (2008-04-09 18:49:00) [30]
> m_theItems:TStringList;
Сишников давить!
Kolan (2008-04-09 18:40:00) [31]> // умру писать полное название
Убью за непонятное сокращение. :)
Palladin (2008-04-09 18:37:00) [32]мне все равно делать нечего... писать то 7-10 минут... да и зря он не пропадет, думаю тем кто сюда заглянет, он будет полезен...
Kolan (2008-04-09 18:31:00) [33]Стыдно даже столько кода пропадает :(
Kolan (2008-04-09 18:30:00) [34]> Palladin
Ты это для меня сейчас написал, да? Благодарю, круто, только ну его нафиг, я лучше цикл из 3х строк оставлю :).
Palladin (2008-04-09 18:27:00) [35]
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 (2008-04-09 18:12:00) [36]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;
Kolan (2008-04-09 16:46:00) [37]> PS. я бы не добавлял F к полям структуры
Согласен. Так получилось:
SamplingFrequencyTable: array[0Գ] of TSamplingFrequencyCorrespondence =
(
(DeviceType: $0103; DeviceVersion: $0500; SamplingFrequency: 97656.25/2;),
(DeviceType: $0104; DeviceVersion: $0300; SamplingFrequency: 97656.25;)
);
Kolan (2008-04-09 16:46:00) [38]> Record constants
Насилу нашел плохой хелп.
Благодарю, разобрался.
zorik (2008-04-09 16:30:00) [39]не успел
zorik (2008-04-09 16:28:00) [40](FA: 1; FB: 2; Value: 3.167),