Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заполнить статический массив записей.


Страницы:   1 2 3

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),


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо