Ссылка на структуру памяти как тип данных - PullRequest
0 голосов
/ 11 февраля 2019

Извините, если этот вопрос повторяется.


tl; dr:

How to :

struct t{ float[3] smthng = {9,1,2,3}; };
float a = (float*)&t; // to get an 9;

Итак, в настоящее время я пытаюсь сэкономить некоторое место в памяти путем перехода python концепт C ++ .Идея состоит в том, чтобы создать таймер пошагового объекта (X = X0 + I*STEP), который будет увеличиваться при каждом вызове и возвращать текущее значение, сохраненное в нем.Поэтому, когда мне нужно создать волну с использованием частотной формулы, я могу просто передать текущее значение таймера.

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

Итак, я создал структуру с текущими, шаговыми и конечными числами с плавающей точкой, но теперь мне нужно иметь возможность распределять цикл по нему и ссылаться только на текущий атрибут (в этом случае step и end являются частными.

Структура таймера

struct timer{

private:
    void reset(){ // resets a current slot
        this->curr = 0.0f;
    }
    bool check(){ // checks if the next steps overflows the limit
        return (( this->curr+this->step) < this->end );
    }
public:
    float curr,step,end;
    timer(){
        this->curr = 0.0f;
        this->step = 1.0f;
        this->end = 10.0f;
    }
    template < class N, class T >
    timer( N step, T end ){
        this -> curr = 0.0f;
        this -> step = (float) step;
        this -> end  = (float) end;
    }

    template < class N >
    timer( N end ){
        this -> end = (float) end;
    }


};
std::ostream& operator<< (std::ostream &out, timer &data) {
    out<< "f(x) = "
            <<"I*" << data.step 
            << " [ "<< data.curr <<" / " << data.end << " ]"; 
    return out;
}

Итак, все, что мне нужно сделать, прежде чем приступить к методам __begin и __end, - это сделать просто:

timer obj;
float a = &obj; // and to get an obj.current value

Я пытался перегрузить operator&, operator* и т. Д. Но каждый раз, когда я пытаюсь прочитать память структура таймера , я получаю только ошибку преобразования.

Так жеКто-нибудь знает, как ссылаться на структуру памяти как определенный тип?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Хотя ответ @ eerorika обеспечивает отличное рабочее решение, я думаю, что будет лучше использовать более прямой подход, чтобы получить текущее время, а не полагаться на оператор приведения.

struct timer
{
    // ...
    float getCurrentTime() const
    {
        return curr;
    }
}

Timer timer;
float cur = timer.getCurrentTime();

более читабельно, чем

Timer timer;
float cur = timer;
0 голосов
/ 11 февраля 2019

Вы можете определить оператор преобразования:

struct timer{
    // ...
    operator float() const {
        return curr;
    }

Это делает класс неявно конвертируемым:

float a = obj;

Технически, точный синтаксис &obj достижим,но перегрузка одинарного operator& ужасный дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...