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

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

Массив из переменных [D7, XP]


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

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]^);  <- Вот это компилируется. Но, как оказалось, и сидит проблема с преобоазованием типов. Я наивно думал, что это будет работать для всех типов численных


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

Наверх

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