#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; в отчаянной попытке совершить глупость. поскольку это сработало не так, как предполагалось. Теперь это работает .. Не знаю , что я сделал .. Классический..