Для зацикливания элементов структуры с указателем на структуру

#c #pointers #struct #arduino #function-pointers

#c #указатели #структура #arduino #указатели на функции

Вопрос:

Я думаю, что моя игра с указателями заржавела, кажется, я не могу заставить работать реализацию цикла for. Это похоже на то, что указатель не увеличивается вместе с массивом. Есть предложения?

Я реализовал «ручную» версию того, что я хочу, чтобы цикл выполнял. Все сработало, как и ожидалось.

 typedef struct txstruct_t
{
    uint8_t tx[8];
    void(*send)(struct txstruct_t *cthis, uint8_t arr[8]);

}txstruct_t;

void send(txstruct_t *cthis, uint8_t arr[8]);


void loop() 
{
    txstruct_t txobj;
    uint8_t buf[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
    send(amp;txobj, buf);

}

// This works
void send(txstruct_t *cthis, uint8_t arr[8])
{
    cthis->tx[0] = arr[0];
    cthis->tx[1] = arr[1];
    cthis->tx[2] = arr[2];
    cthis->tx[3] = arr[3];
    cthis->tx[4] = arr[4];
    cthis->tx[5] = arr[5];
    cthis->tx[6] = arr[6];
    cthis->tx[7] = arr[7];

    return;
};

/*
//This doesn't work :(
void send(txstruct_t *cthis, uint8_t arr[8])
{

    for (int i = 0; i < 8; i  )
    {
        cthis = cthis   i;
        cthis->tx[i] = arr[i];
    }

    return;
};*/

 

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

Комментарии:

1. На что эта логика cthis i (где i > 0) должна указывать при передаче amp;txobj ?

2. Если вы хотите попробовать арифметику указателей, вы могли бы сделать uint8_t dataptr = cthis->tx; for (int i = 0; i < 8; i ) { *(dataptr ) = arr[i]; } . КСТАТИ: я предлагаю заменить магическое число 8 #define enum значением или txstruct_t и использовать sizeof(cthis->tx) для ограничения цикла в вашей send функции.

3. Да, спасибо @Bodo, конечно. Это был всего лишь быстрый и грязный тест 🙂 Но вы абсолютно правы!

Ответ №1:

cthis = cthis i; может быть удален. Это вообще не имеет смысла, поскольку это неопределенная попытка каким-то образом сбросить указатель на struct . Вы не делаете этого в развернутой версии цикла, не так ли?

Другие компоненты цикла в порядке.

Комментарии:

1. Я добавил cthis = cthis i; в отчаянной попытке совершить глупость. поскольку это сработало не так, как предполагалось. Теперь это работает .. Не знаю , что я сделал .. Классический..