Структуру в массив

 

Подскажите пожалуйста. Не знаю, как правильно такое делается с точки зрения синтаксиса кода:

// Предположим, у меня есть такая структура
struct myStruct {
   string lineName;
   double linePrice;
} MyStruct;

// Хочу сделать следующее:
myStruct myStructArray[2]; // Типо создаю массив

myStructArray[0] = MyStruct.linePrice; // Типо в первый элемент массива вставляю тип double из структуры
myStructArray[1] = MyStruct.lineName;  // Типо во второй элемент массива вставляю тип string из структуры
// Не знаю, как это правильно с точки зрения синтаксиса кода делать. Подскажите пожалуйста

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

Вроде как где-то на форуме встречал мысль, что это возможно, но не знаю, как это правильно делается с точки зрения синтаксиса кода.

 
yar.forex:

Подскажите пожалуйста. Не знаю, как правильно такое делается с точки зрения синтаксиса кода:

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

Вроде как где-то на форуме встречал мысль, что это возможно, но не знаю, как это правильно делается с точки зрения синтаксиса кода.

myStructArray[0].linePrice=1.111;
myStructArray[1].lineName="xxx"; 
 
Sergey Deev #:

Охх, спасибо большое )

Как мало надо, чтобы сделать человека счастливым )))

 
yar.forex #:

Охх, спасибо большое )

Как мало надо, чтобы сделать человека счастливым )))

Только для счастья такого решения недостаточно. Какой прок от такого массива и структуры? Ну записали вы что-то в структуру, ну потом из структуры в массив……… и что? Хотя я даже сомневаюсь, что предложенный Сергеем вариант будет работать… но проверять не буду.

Нормальный массив структур выглядет так

struct myStruct
 {
   string lineName;
   double linePrice;
 } MyStruct[];// Также можно задать фиксированный размер массива

// А можно перед внесением новой записи увеличить размер динамического массива
MyStruct[0].lineName = "огого";
MyStruct[0].linePrice = 1.12453;
 
Alexey Viktorov #:

Только для счастья такого решения недостаточно. Какой прок от такого массива и структуры? Ну записали вы что-то в структуру, ну потом из структуры в массив……… и что? Хотя я даже сомневаюсь, что предложенный Сергеем вариант будет работать… но проверять не буду.

Нормальный массив структур выглядет так

Я надеялся, что с помощью массива, я смогу более простым способом рассортировать структуру. Чтобы, к примеру, "linePrice" шли в порядке возрастания, а не в перемешку, как до сортировки.

Но, к сожалению, оказалось, что нельзя сортировать структуры с помощью функции ArraySort(). Уже написал собственный кустарный метод для сортировки нужных мне структур по определенным параметрам.

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

 
#include <Arrays/ArrayObj.mqh>

class Line : public CObject {
private:
    string  m_name;
    double  m_price;
public:
    Line(string name, double price) { m_name = name; m_price = price; };
    double Price() { return m_price; };
    string ToStr() { return StringFormat("%s = %.5f", m_name, m_price); };
    virtual int Compare(const CObject *item, const int mode=0) const;    
};

int Line::Compare(const CObject *item,const int mode=0) const {
    Line *line = (Line *)item;
    if (m_price > line.Price()) return (mode == 0) ? 1 : -1;
    if (m_price < line.Price()) return (mode == 0) ? -1 : 1;
    return 0;
};


void OnStart() {
    
    CArrayObj *lines = new CArrayObj();
    
    lines.Add(new Line("nameX", 1.05));
    lines.Add(new Line("nameY", 1.25));
    lines.Add(new Line("nameZ", 1.15));
    
    //lines.Sort(); // в порядке возрастания
    lines.Sort(1); // в порядке убывания
    for (int j = 0; j < lines.Total(); j++) {
        Line *line = lines.At(j);
        PrintFormat("[%i] %s", j, line.ToStr());
    }
    delete lines;
}
Параметр mode позволяет организовать сортировку по любому свойству объекта. Для этого нужно изменить функцию Compare
 
Malik Arykov #:
Параметр mode позволяет организовать сортировку по любому свойству объекта. Для этого нужно изменить функцию Compare

Спасибо большое за ответ. Выглядит очень полезно. Возьму на вооружение!

 
yar.forex #:

Спасибо большое за ответ. Выглядит очень полезно. Возьму на вооружение!

для эстетичности можно еще и так

#define MODE_ASCEND   1             // режим возрастания
#define MODE_DESCEND -1             // режим убывания
что бы не писать -1 и 1