![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массив из переменных [D7, XP]
jetairnav © (2015-12-18 09:42:00)Всем привет! Вопрос такой: существует ли механизм перечисления переменных? Конкретно хочется что-то типа такого:
var ArrayOfVar:array[0..n] of Pointer (@Int, @Double, @Str....);
Value:= ArrayOfVar[index]^;
jetairnav (2015-12-18 20:34:00) [21]
> procedure TForm1.Button1Click(Sender: TObject);
> const
> points: array[0..3] of Double = (1, 28, 34, 11);
> begin
> Chart1.Series[0].AddArray(points);
> end;
Этот код не имеет ничего общего с проблематикой вопроса. Но, в любом случае, спасибо за отзыв.
sniknik (2015-12-18 20:11:00) [22]нужно не чувствовать, а читать стправку... или хотя бы методы у того с чем пытаешься работать порассматривать. если чувствовать, то просто напейся и чувствуй себя президентом мира. чего мелочится?
> Ну, это просто для простоты следующего:
procedure TForm1.Button1Click(Sender: TObject);
const
points: array[0..3] of Double = (1, 28, 34, 11);
begin
Chart1.Series[0].AddArray(points);
end;
jetairnav (2015-12-18 17:51:00) [23]
> KSergey © (18.12.15 17:24) [25]
И да, я не программист, поэтому могу себе позволить любые эстетства)) Просто иногда хочется чуть облегчить себе жизнь самописным тулзом и радоваться, но при этом чувствовать себя настоящим крутейшим кодером )))
jetairnav (2015-12-18 17:49:00) [24]
> KSergey © (18.12.15 17:24) [25]
А почему ахинея? Лучше делать через сотню if? ))
KSergey (2015-12-18 17:24:00) [25]> for i:=0 to NumberOfRecords-1 do
> begin
> ParsedISB:= ParsedISB_Arr[i];
> chart1.series[0].Add(ArrayOfPointers[RadioGroup1.ItemIndex]^)
> end;
Это какая-то ахинея, товарищи.
KSergey (2015-12-18 17:22:00) [26]> jetairnav (18.12.15 17:16) [23]
> Т.е. очень хочется, чтобы код выглядел как у крутых пацанов.
Это сказки :)
Продакшен-код - это куча if'ов под разные дебильные экзотические случаи и для обеспечения обратной совместимости. Ничего доброго в нём нет.
Круто - это просто соблюдать баланс между потреблением ресурсов и поддерживаемостью кода. При этом укладываясь в требуемые сроки, вот и всё.
jetairnav (2015-12-18 17:16:00) [27]
> KSergey © (18.12.15 16:49) [21]
Т.е. очень хочется, чтобы код выглядел как у крутых пацанов... А можно было бы
и через case все сделать..
jetairnav (2015-12-18 17:15:00) [28]
> KSergey © (18.12.15 16:44) [20]
> Кстати, а зачем вообще имея уже красивый структуру с отдельными
> полями вдруг заводить массив, содержащий указатели на элементы
> структуры??
Ну, это просто для простоты следующего:
for i:=0 to NumberOfRecords-1 do
begin
ParsedISB:= ParsedISB_Arr[i];
chart1.series[0].Add(ArrayOfPointers[RadioGroup1.ItemIndex]^)
end;
KSergey (2015-12-18 16:49:00) [29]> jetairnav (18.12.15 14:26) [14]
> RadStudio XE7. А почему Вы так суровы к разработчикам? И
> , если можно, то чуть подробнее про типизированные указатели на variant.
Такое предложение.
Вы почитаете статьи в гугле, которые вам попадутся по фразе "разыменование указателей delphi", а после спросите что конкретно вам не удалось понять.
Ну просто это уже написано всё тыщу раз, зачем я буду писать еще раз с бухты-барахты, чего-нибудь напутаю или упущу нюанс какой важный.
Уверен, после прочтения вы сами сможете ответить на ваш вопрос. Собственно это и будет критерием того, что вы уже поняли написанное, или стоит еще раз наз перечитать.
Но если приведённый вами код в самом деле компилируется - то это форменное безобразие и идиотизм разработчиков компилятора, а полученные вами проблемы, которые вы назвали "шлак" - наглядное тому подтверждение.
KSergey (2015-12-18 16:44:00) [30]Кстати, а зачем вообще имея уже красивый структуру с отдельными полями вдруг заводить массив, содержащий указатели на элементы структуры??
KSergey (2015-12-18 16:43:00) [31]> jetairnav (18.12.15 15:28) [18]
> распросить у мастеров как сделать правильнее
Слишком неоднозначны критерии правильности.
Потому что разные факторы по-разному влияют на различные параметры, а значит идеального варианта "вообще" - нет. Приходится искать баланс и выбирать наилучший вариант в данном конкретном случае, а не "вообще".
В смысле простоты реализации и поддержки самый простой способ - хранить типа variant для каждого поля. Всё работает волшебно.
Но этот вариант поедает больше памяти и работает медленнее в сравнении с вариантом, когда для каждого поля используется именно тот тип, который для него и нужен. Однако такой код сложнее в написании и, того хуже, в поддержке. Особенно будет огребалово, когда какое-то понадобится изменить тип какого-то поля. С вариантами вы этого даже не заметите, а тут много сюрпризов ждёт в продакшене, если где-то забудется исправить приведение типов.
Так что тут надо смотреть что за задача, какой объём данных необходимо хранить/обрабатывать, какие сроки на разработку.
jetairnav (2015-12-18 15:28:00) [32]
> sniknik © (18.12.15 15:25) [17]
Ну.. это же раздел для новичков. Я потому и здесь, чтобы распросить у мастеров как сделать правильнее
sniknik (2015-12-18 15:25:00) [33]> Разве это не тоже самое, что и у меня
нет конечно, вариант это "универсальный" тип.
> И это помогает...
отсутствие явных ошибок компиляции/приведения типов/... еще не значит, что логика в порядке.
jetairnav (2015-12-18 15:07:00) [34]
> sniknik © (18.12.15 14:56) [15]
Разве это не тоже самое, что и у меня. И это помогает...
sniknik (2015-12-18 14:56:00) [35]> чуть подробнее
type
TParsedISB = record
Addr : Variant;
Counter: Variant;
SW : Variant;
Tsys : Variant;
Data : array[0..2] of Variant;
dV : array[0..2] of Variant;
end;
var
ParsedISB: TParsedISB;
ArrayOfPointers: array[0..1] of PVariant = (
@ParsedISB.Addr,
@ParsedISB.Counter,
...
);
но теперь мне кажется, что вариант не поможет... в консерватории что то не то.
jetairnav (2015-12-18 14:26:00) [36]
> KSergey © (18.12.15 14:17) [13]
RadStudio XE7. А почему Вы так суровы к разработчикам? И , если можно, то чуть подробнее про типизированные указатели на variant.
KSergey (2015-12-18 14:17:00) [37]> r:= Real(ArrayOfPointers[0]^); <- Вот это компилируется
Версия компилятора?
Если в самом деле компилируется - по башке криворуким разработчикам, вообще-то.
KSergey (2015-12-18 14:16:00) [38]> r:= Variant(ArrayOfPointers[0]^);
Тогда может сразу хранить в массиве типизированные указатели на variant?
Как-то красивше и разумнее же.
jetairnav (2015-12-18 14:05:00) [39]Type TParsedISB = {packed} record // Измерения
Addr: variant;
Counter: variant;
SW: variant;
Tsys: variant;
Data: array[0..2]of variant;
dV:array[0..2] of variant;
end;
var
MainForm: TMainForm;
ParsedISB: TParsedISB;
TParsedISB_Arr: array of TParsedISB_Message;
ArrayOfPointers: array[0..n] of Pointer=(
@ParsedISB.AddrIIB,
@ParsedISB.Counter,
@ParsedISB.SW,
@ParsedISB.Tsys,
@ParsedISB.Data[0]
...)
...
begin
...
ParsedISB_Message:= ParsedISB_Message_Arr[1];
r:= Variant(ArrayOfPointers[0]^);
...
end;
jetairnav (2015-12-18 14:03:00) [40]r:= Real(ArrayOfPointers[0]^); <- Вот это компилируется. Но, как оказалось, и сидит проблема с преобоазованием типов. Я наивно думал, что это будет работать для всех типов численных