Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.11.19;
Скачать: [xml.tar.bz2];

Вниз

Массив из переменных   Найти похожие ветки 

 
jetairnav   (2015-12-18 09:42) [0]

Всем привет! Вопрос такой: существует ли механизм перечисления переменных? Конкретно хочется что-то типа такого:
var ArrayOfVar:array[0..n] of Pointer (@Int, @Double, @Str....);
Value:= ArrayOfVar[index]^;


 
sniknik ©   (2015-12-18 10:14) [1]

> Конкретно хочется что-то типа такого:
и в чем проблема? конкретно так вот и делай... ну может var на const поменять (вроде как инициализация на var нововведение, а const еще с паскаля работало)


 
sniknik ©   (2015-12-18 10:14) [2]

+
хотя, ИМХО, массив вариантов был бы лучше.


 
jetairnav   (2015-12-18 11:57) [3]


> sniknik ©   (18.12.15 10:14) [1]

Почему-то не работает через var ArrayOfVar:array[0..n] of Pointer (@Int, @Double, @Str....)
В Value какой-то шлак((


 
KSergey ©   (2015-12-18 11:59) [4]

Что значит "шлак"?
Хорошо бы минимальный пример реального кода, на котором понятно что хотите и где шлак


 
jetairnav   (2015-12-18 12:06) [5]

Type  TParsedISB = {packed} record       // Измерения

   Addr:           byte;            
   Counter:           byte;            
   SW:                word;            
   Tsys:              Real;            
   Data: array[0..2]of  Real;        
   dV:array[0..2]  of     Real;        

end;

var

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];
   // chart1.series[0].Add(Real(ArrayOfPointers[1]^))
    r:= Real(ArrayOfPointers[0]^);
...

 end;


 
KSergey ©   (2015-12-18 13:27) [6]

Вот такой код ожидаемо не компилируется:

procedure TForm1.Button22Click(Sender: TObject);
var
   ArrayOfPointers: array[0..10] of Pointer;
   i: Integer;
begin
   i := Real(ArrayOfPointers[0]^);
end;

но вы зачем-то его приводите в качестве примера:

   r:= Real(ArrayOfPointers[0]^);

Вопрос: зачем вы задаёте вопрос о неработоспособности не компилируемого кода?
Вы можете точно задать вопрос? ответ-то вам нужен, а не кому-то еще.


 
KSergey ©   (2015-12-18 13:32) [7]

Похоже, что по сути, проблема вот где: вы берете наименованный указатель и пытаетесь разыменовать хранящееся значение по этому указателю. Понятно, получаете мусор.
Сначала нужно сделать, чтобы указатель был какого-то определённого типа, а уж потом разыменовывать его.
Например как-то так:

procedure TForm1.Button22Click(Sender: TObject);
type
   PInteger = ^Integer;
var
   ArrayOfPointers: array[0..10] of Pointer;
   a: Integer;
   i: Integer;
begin
   a := 88;
   ArrayOfPointers[0] := @a;
   i := PInteger(ArrayOfPointers[0])^;
end;

Вот теперь у нас всё будет хорошо и в i окажется значение 88.


 
KSergey ©   (2015-12-18 13:33) [8]

> Похоже, что по сути, проблема вот где: вы берете наименованный

Извиняюсь, опечатки, мешающие пониманию
Должно быть так:

Похоже, что проблема вот где: вы берете неименованный


 
Юрий Зотов ©   (2015-12-18 13:36) [9]

Всеми четырьмя конечностями голосую за [2].


 
jetairnav   (2015-12-18 14:03) [10]

r:= Real(ArrayOfPointers[0]^);  <- Вот это компилируется. Но, как оказалось, и сидит проблема с преобоазованием типов. Я наивно думал, что это будет работать для всех типов численных


 
jetairnav   (2015-12-18 14:05) [11]

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;


 
KSergey ©   (2015-12-18 14:16) [12]

> r:= Variant(ArrayOfPointers[0]^);

Тогда может сразу хранить в массиве типизированные указатели на variant?
Как-то красивше и разумнее же.


 
KSergey ©   (2015-12-18 14:17) [13]

> r:= Real(ArrayOfPointers[0]^);  <- Вот это компилируется

Версия компилятора?
Если в самом деле компилируется - по башке криворуким разработчикам, вообще-то.


 
jetairnav   (2015-12-18 14:26) [14]


> KSergey ©   (18.12.15 14:17) [13]

RadStudio XE7. А почему Вы так суровы к разработчикам?  И , если можно, то чуть подробнее про типизированные указатели на variant.


 
sniknik ©   (2015-12-18 14:56) [15]

> чуть подробнее
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 15:07) [16]


> sniknik ©   (18.12.15 14:56) [15]

Разве это не тоже самое, что и у меня. И это помогает...


 
sniknik ©   (2015-12-18 15:25) [17]

> Разве это не тоже самое, что и у меня
нет конечно, вариант это "универсальный" тип.

> И это помогает...
отсутствие явных ошибок компиляции/приведения типов/... еще не значит, что логика в порядке.


 
jetairnav   (2015-12-18 15:28) [18]


> sniknik ©   (18.12.15 15:25) [17]

Ну.. это же раздел для новичков. Я потому и здесь, чтобы распросить у мастеров как сделать правильнее


 
KSergey ©   (2015-12-18 16:43) [19]

> jetairnav   (18.12.15 15:28) [18]
> распросить у мастеров как сделать правильнее

Слишком неоднозначны критерии правильности.
Потому что разные факторы по-разному влияют на различные параметры, а значит идеального варианта "вообще" - нет. Приходится искать баланс и выбирать наилучший вариант в данном конкретном случае, а не "вообще".

В смысле простоты реализации и поддержки самый простой способ - хранить типа variant для каждого поля. Всё работает волшебно.

Но этот вариант поедает больше памяти и работает медленнее в сравнении с вариантом, когда для каждого поля используется именно тот тип, который для него и нужен. Однако такой код сложнее в написании и, того хуже, в поддержке. Особенно будет огребалово, когда какое-то понадобится изменить тип какого-то поля. С вариантами вы этого даже не заметите, а тут много сюрпризов ждёт в продакшене, если где-то забудется исправить приведение типов.

Так что тут надо смотреть что за задача, какой объём данных необходимо хранить/обрабатывать, какие сроки на разработку.


 
KSergey ©   (2015-12-18 16:44) [20]

Кстати, а зачем вообще имея уже красивый структуру с отдельными полями вдруг заводить массив, содержащий указатели на элементы структуры??


 
KSergey ©   (2015-12-18 16:49) [21]

> jetairnav   (18.12.15 14:26) [14]
> RadStudio XE7. А почему Вы так суровы к разработчикам?  И
> , если можно, то чуть подробнее про типизированные указатели  на variant.

Такое предложение.
Вы почитаете статьи в гугле, которые вам попадутся по фразе "разыменование указателей delphi", а после спросите что конкретно вам не удалось понять.
Ну просто это уже написано всё тыщу раз, зачем я буду писать еще раз с бухты-барахты, чего-нибудь напутаю или упущу нюанс какой важный.

Уверен, после прочтения вы сами сможете ответить на ваш вопрос. Собственно это и будет критерием того, что вы уже поняли написанное, или стоит еще раз наз перечитать.

Но если приведённый вами код в самом деле компилируется - то это форменное безобразие и идиотизм разработчиков компилятора, а полученные вами проблемы, которые вы назвали "шлак" - наглядное тому подтверждение.


 
jetairnav   (2015-12-18 17:15) [22]


> 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;


 
jetairnav   (2015-12-18 17:16) [23]


> KSergey ©   (18.12.15 16:49) [21]

Т.е. очень хочется, чтобы код выглядел как у крутых пацанов... А можно было бы
и через case все сделать..


 
KSergey ©   (2015-12-18 17:22) [24]

> jetairnav   (18.12.15 17:16) [23]
> Т.е. очень хочется, чтобы код выглядел как у крутых пацанов.

Это сказки :)

Продакшен-код - это куча if"ов под разные дебильные экзотические случаи и для обеспечения обратной совместимости. Ничего доброго в нём нет.

Круто - это просто соблюдать баланс между потреблением ресурсов и поддерживаемостью кода. При этом укладываясь в требуемые сроки, вот и всё.


 
KSergey ©   (2015-12-18 17:24) [25]

> for i:=0 to NumberOfRecords-1 do
>    begin
>     ParsedISB:= ParsedISB_Arr[i];
>     chart1.series[0].Add(ArrayOfPointers[RadioGroup1.ItemIndex]^)
>    end;

Это какая-то ахинея, товарищи.


 
jetairnav   (2015-12-18 17:49) [26]


> KSergey ©   (18.12.15 17:24) [25]

А почему ахинея? Лучше делать через сотню if? ))


 
jetairnav   (2015-12-18 17:51) [27]


> KSergey ©   (18.12.15 17:24) [25]

И да, я не программист, поэтому могу себе позволить любые эстетства)) Просто иногда хочется чуть облегчить себе жизнь самописным тулзом и радоваться, но при этом чувствовать себя настоящим крутейшим кодером )))


 
sniknik ©   (2015-12-18 20:11) [28]

нужно не чувствовать, а читать стправку... или хотя бы методы у того с чем пытаешься работать порассматривать. если чувствовать, то просто напейся и чувствуй себя президентом мира. чего мелочится?

> Ну, это просто для простоты следующего:
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 20:34) [29]


> procedure TForm1.Button1Click(Sender: TObject);
> const
>  points: array[0..3] of Double = (1, 28, 34, 11);
> begin
>  Chart1.Series[0].AddArray(points);
> end;

Этот код не имеет ничего общего с проблематикой вопроса. Но, в любом случае, спасибо за отзыв.


 
KSergey ©   (2015-12-18 23:08) [30]

> jetairnav   (18.12.15 17:49) [26]
> А почему ахинея? Лучше делать через сотню if? ))

Я не знаю куда вы собираетесь приткнуть там if, но вы в самом деле почитали бы справку по методу Add(). там же всё написано.
Неужели это метод может принимать массив указателей вперемешку на разные типы?
Да точно не может, не делают так, поэтому я и говорю смело: ахинея.
Как сделать правильно - написано в справке.


 
Юоий Зотов   (2015-12-18 23:29) [31]

>  я не программист, поэтому могу себе позволить любые эстетства

Шикарно. Записал а тетрадку а-ля "анекдоты про программистов". Спасибо.


 
Юоий Зотов   (2015-12-18 23:30) [32]

Удалено модератором
Примечание: Дубль


 
jetairnav   (2015-12-19 10:20) [33]


> sniknik ©   (18.12.15 20:11) [28]

> for i:=0 to NumberOfRecords-1 do
>    begin
>     ParsedISB:= ParsedISB_Arr[i];
>     chart1.series[0].Add(ArrayOfPointers[RadioGroup1.ItemIndex]^)
>    end;

ArrayOfPointers[RadioGroup1.ItemIndex]^ - это не массив, а лишь одно его значение..


 
jetairnav   (2015-12-19 10:28) [34]

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;
ParsedISB_Arr:= array of TParsedISB;
ArrayOfPointers: array[0..K] of PVariant = (
  @ParsedISB.Addr,
  @ParsedISB.Counter,
  ...
 );
const ParamNames :array[0..K] of String=("Addr", "Counter"....)
...
procedure TMainForm.OnCreate(Sender: TObject);
var i: integer;
begin
for i := 0 to High(ParamArray) do
    RadioGroup1.Items.Add(ParamNames[i])
end;
   
....

procedure TMainForm.Button1Click(Sender: TObject);
var i: integer;
begin

  for i:=0 to NumberOfRecords-1 do
   begin
    ParsedISB:= ParsedISB_Arr[i];
    chart1.series[0].Add(ArrayOfPointers[RadioGroup1.ItemIdex]^ )
  end;
 
 

  @ParsedISB.Addr,
  @ParsedISB.Counter,
  ...
 );
const ParamNames :array[0..K] of String=("Addr", "Counter"....)


 
sniknik ©   (2015-12-21 08:10) [35]

> Этот код не имеет ничего общего с проблематикой вопроса.
ну, может потому, что "проблематика" - ахинея? а этот код вполне конкретное действие выполняет, причем то же что и у тебя, но короче, и проще чем "для простоты" -
> Ну, это просто для простоты следующего:
ты бы написал словами что от каждого действия ожидаешь, т.к. кодом ты делаешь(а мы читаем) явно не не то.

> ArrayOfPointers[RadioGroup1.ItemIndex]^ - это не массив, а лишь одно его значение..
такой загадочный...
и что?

ладно попробуем на "твоем" языке
Chart1.Series[0].AddArray(points); - это не массив это весь твой цикл..


 
jetairnav   (2015-12-21 09:33) [36]

Итак, словами...
На каждом такте цикла присваиваем значение переменной типа TParsedISB текущее значение массива типа TParsedISB.  Отображаем в tchart значение поля записи. А вот что это за поле выбирается с помощью массива из указателей на каждое из них. Номер в массиве соответсьвует значению RadioButton.ItemIndex.
Таким образом, пользователь чудо-программы нажимает на интересующую его кнопку RadioButton с названием переменной и наслаждается превосходным ее изображением в TChart.


 
sniknik ©   (2015-12-21 10:55) [37]

> присваиваем значение переменной типа TParsedISB
это и так видно из кода. а смысл действий какой? не что, а зачем.

> Отображаем в tchart значение поля записи.
в коде у тебя не поля записи, а одно поле из списка записей, через промежуточный массив (греем процессор?).

> нажимает на интересующую его кнопку RadioButton с названием переменной и наслаждается
чем? чего ты хочешь показать? смысл?


 
sniknik ©   (2015-12-21 10:58) [38]

> в коде у тебя
в последнем само собой, хоть что то проясняется, до этого было вообще не пойми что.


 
jetairnav   (2015-12-21 11:03) [39]

Короче говоря, к главному вопросу и тому, как я пытаюсь его решить. Идея такая, есть бинарный типизированный файл. Хочется сделать утилиту, которая загружала бы данные этого файла в память, а затем отображала данные конкретного поля по желанию польщователя. Не придумал ничего лучшего, чем сделать как в  вышеприведенном говнокоде.
Если так стремно, то как лучше?


 
jetairnav   (2015-12-21 11:13) [40]

И  основная идея этого говнокода -  это сопоставление номера в массиве RAdioButtonGroup и номера в массиве с указателями.


 
sniknik ©   (2015-12-21 11:25) [41]

> данные конкретного поля
поля? т.е. колонки если представлять в табличном виде?  

> то как лучше?
ну раз уж пошли "записи" и "поля"... то лучше оформить в таблицу и показать все сразу в гриде... так и с графиком, если нужен, будет удобнее/нагляднее работать (ну можно к примеру в Exсel кинуть и там его график подключить, динамически настраиваемый пользователем, хотя Exсel конечно не всегда вариант ;(, у нас к примеру работа с ним административно ограничена, не у всех есть).


 
sniknik ©   (2015-12-21 11:36) [42]

\Delphi7\Demos\TeeChart\
Chart Styles... -> Database Charts


 
sniknik ©   (2015-12-21 11:37) [43]

хотя, само собой BDE очень уж устарел, заменить чем нибудь поновее.


 
jetairnav   (2015-12-21 12:56) [44]

Да, идея с таблицей более изящная, спасибо!


 
jetairnav   (2015-12-21 14:09) [45]

А может тогда вообще хранить данные в таблице?.. Посоветуете что-нить прогрессивное?


 
jetairnav   (2015-12-21 14:11) [46]

А может тогда вообще хранить данные в таблице?.. Посоветуете что-нить прогрессивное?


 
sniknik ©   (2015-12-21 14:20) [47]

> А может тогда вообще хранить данные в таблице?..
если сам и пишешь и читаешь данные (а не абстрактно "есть бинарный типизированный файл") то однозначно да.

> Посоветуете что-нить прогрессивное?
облака-хмл-веб?... ну нафиг. прогрессивность нынче излишне усложнена в угоду маркетингу.

простое/привычное - ADODataSet в форме ClientDataSet (сам "клиент" требует модуля мидас, у ADO аналог предустановлен в системе, а по сути позволяет тоже самое, т.е. проще).
поля в дизайне прописать и -
ADODataSet1.CreateDataSet/SaveToFile()/LoadFromFile();
все в общем то.


 
jetairnav   (2015-12-21 15:06) [48]

Спасибо!


 
jetairnav   (2015-12-21 15:07) [49]

Спасибо!



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2017.11.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.003 c
2-1451037235
Михалыч
2015-12-25 12:53
2017.11.19
Программное удаление в Firebird


15-1467649943
Копир
2016-07-04 19:32
2017.11.19
И не скучно Вам?


15-1467813185
Unbekannt
2016-07-06 16:53
2017.11.19
Проблема с печатью этикеток на разных принтерах


15-1467815349
KSergey
2016-07-06 17:29
2017.11.19
set of TEnum в Си


2-1450907758
Black
2015-12-24 00:55
2017.11.19
динамический Lookup список для TComboBoxEx





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский