Указатель на структуру

Тема в разделе "Микроконтроллеры AVR", создана пользователем parovoZZ, 8 янв 2019.

  1. parovoZZ

    parovoZZ Гуру

    Есть, парни, у меня такая функция
    Код (C++):
    void SPI_ReadArray(uint8_t num, uint8_t *data)
    {

        while(num--)
        {    
            *data++ = SPI_WriteByte(*data);
        }

    }
    и есть такая
    Код (C++):
    uint8_t Receive(uint8_t *rx_data)
    {
        uint8_t length;

    // тут многовнокода

            SPI_ReadArray(length, *rx_data);                // Читаем данные

    // тут тоже многовнокода

            return length;
        }

        return 0;                                // Выходим с нулем, если длина сообщения не совпадает
    }
    и всё это мракобесие я хочу отыметь через структуру. Да вот незадача - как взять указатель на нее? Чтобы тупо написать
    Код (C++):
    Receive(my_struct_1);
    Объявить типа
    Код (C++):
    struct my_struct *my_struct_1;
    ?

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

    И это - компилятор на замракожопит (через байт расположит в памяти для 8-ми биток?) поля структуры? На буфер вообще не хочу переходить.
     
  2. parovoZZ

    parovoZZ Гуру

    Да, не сказал, вариант
    Код (C++):
    Receive(&my_struct_1);
    порождает у компилятора варнинг и мессагу
    Это жжжж не спроста...
     
  3. DetSimen

    DetSimen Спамовредитель Модератор

    Код (C++):
    #pragma pack(push,1)    // выравнивание 1 байт

    struct TBufferData {
    public:
        uint8_t        Length;
        uint8_t        *Data;

        TBufferData(uint8_t length) { Data = new uint8_t[Length = length]; };
        ~TBufferData() { delete[] Data; };
    };

    #pragma pack(pop)

    TBufferData MyData(32);

    void SPI_ReadArray(uint8_t num, uint8_t *data)
    {

        while (num--)
        {
            *data++ = SPI_WriteByte(*data);
        }

    }


    uint8_t Receive(TBufferData &rx_data)
    {
        uint8_t length = rx_data.Length;

        // тут многовнокода

        SPI_ReadArray(length, rx_data.Data);                // Читаем данные

                                                        // тут тоже многовнокода

        return length;// ??? нигде не меняеца
    }
     
    вызов: Receive(MyData);
     
    Последнее редактирование: 8 янв 2019
    Andrey12 нравится это.
  4. DetSimen

    DetSimen Спамовредитель Модератор

    про внутренности функций ничего не скажу, ты спрашивал только как структуру передать.
    Мог спьяну ашыбицца.
     
    Andrey12 нравится это.
  5. Ну а типы-то кто приводить будет?
     
  6. KindMan

    KindMan Гик

    Вопрос, в целях самообразования, почему это вас не устраивает?
     
    SergeiL и b707 нравится это.
  7. parovoZZ

    parovoZZ Гуру

    ну так бы и я написал и не задавал вопросов) Я же хочу именно uint8_t.

    указатель на структуру к uint или uint к структуре?

    религия)) Но, видимо, так и придется сделать.

    Я правильно понимаю, что запись uint8_t *rx_data аналогична uint8_t* rx_data? И такая запись говорит нам, что это указатель на переменную размерностью uint8_t, а сам указатель (двухбайтный адрес?) спрятан от наших глаз?
     
    Последнее редактирование: 8 янв 2019
  8. parovoZZ

    parovoZZ Гуру

    а вот это точно Си? Может, GO! ? Реально можно на сях в структуре организовать конструктор и деструктор?
     
  9. SergeiL

    SergeiL Гуру

    Если указатель на структуру то доступ к элементу через ->
    Если структура, то доступ через точку.
    Вроде все однозначно :)
     
  10. DetSimen

    DetSimen Спамовредитель Модератор

    Не путайся в показаниях
    Если надо так
    то Receive((uint8_t *)(&my_struct_1)); // да и всё.
     
  11. DetSimen

    DetSimen Спамовредитель Модератор

    Нет. Это не С, это С++. (но это неточно :) )
    на 146% точно знает только Asper Daffy
     
    Последнее редактирование: 9 янв 2019
  12. parovoZZ

    parovoZZ Гуру

    ну держи миску со сметаной!

    Ой, не. Стакан с водкой!
     
  13. DetSimen

    DetSimen Спамовредитель Модератор

    до завтра не полезет.
     
  14. Asper Daffy

    Asper Daffy Гуру

    На сях не бывает ни конструкторов, ни деструкторов. На С++ - сколько угодно. struct от class в С++ отличается очень незначительно - это почти одно и тоже.
     
    DetSimen нравится это.
  15. parovoZZ

    parovoZZ Гуру

    стакан водки я нахлобучу. А ты ешь сметану, а то и её отберу!
     
  16. DetSimen

    DetSimen Спамовредитель Модератор

    вот спасибо. :( если б я так со своим котом обращался, он бы мне давно все ноги до колен сгрыс.
     
  17. Asper Daffy

    Asper Daffy Гуру

    "водку мне, а остальное - ему."

     
    Andrey12 и DetSimen нравится это.