Динамически изменить тип данных массива указателей на структуру - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь закодировать массив указателей переменных из структуры.Моя проблема в том, что переменные внутри структуры имеют разные типы данных.

#include "stdlib.h"

typedef struct val {
 unsigned char a;
 unsigned char b;
 unsigned short c;
 unsigned int d;
} _letters;

void setup() {
 Serial.begin(9600);
}

int var1 = 0;

void loop() {
 _letters lt;
 lt.a = 1;
 lt.b = 2;
 lt.c = 3;
 lt.d = 4;

 unsigned char *ptrLetters[4];
 ptrLetters[0] = &lt.a;
 ptrLetters[1] = &lt.b;
 ptrLetters[2] = &lt.c;   //here is the problem
 ptrLetters[3] = &lt.d;  //also here

 var1 = (int)*ptrLetters[0];

 Serial.println(var1);
}

Цель этого заключается в том, что я хочу сохранить адрес и получить доступ к переменным из структуры (которую я НЕ МОГУ изменять)по индексу массива (* ptrLetters [index]), но проблема в том, что внутри структуры есть разные типы данных, и указатель инициализируется только для типов символов.Как мне динамически изменить это?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Указатель на объект любого типа может быть неявно преобразован в Указатель на void (опционально cv-qualified);значение указателя не изменяется.Обратное преобразование, которое требует static_cast или явного приведения, дает исходное значение указателя:

void *ptrLetters[4];
ptrLetters[0] = &lt.a;
ptrLetters[1] = &lt.b;
ptrLetters[2] = &lt.c;   //no more problem
ptrLetters[3] = &lt.d;  //no more problem here as well

Для разыменования в C вы можете просто сделать это:

unsigned char var1 = *((char*)ptrLetters[0]);
unsigned char var2 = *((char*)ptrLetters[1]);
unsigned short var3 = *((unsigned short*)ptrLetters[2]);
unsigned int var4 = *((unsigned int*)ptrLetters[3]);

Поскольку вы пометили это и в C ++, лучше использовать static_cast в C ++.

unsigned char var1 = *(static_cast<unsigned char*>(ptrLetters[0]));
unsigned char var2 = *(static_cast<unsigned char*>(ptrLetters[1]));
unsigned short var3 = *(static_cast<unsigned short*>(ptrLetters[2]));
unsigned int var4 = *(static_cast<unsigned int*>(ptrLetters[3]));
0 голосов
/ 15 ноября 2018

Вы мало объяснили, почему вы хотите использовать только массив указателей или почему вы вообще хотите использовать указатели.Основываясь на том, что вы пытаетесь сделать в своем примере кода, вы можете сделать это разными способами.

Самым простым будет использование указателя на структуру:

_letters *ptrLetter;
ptrLetter = &lt;

var1 = ptrLetter->a;

Вы также можетеизучить структуру указателей или использовать классы C ++ для совместного хранения данных и указателя.

0 голосов
/ 15 ноября 2018

Вы можете использовать массив пустых (нетипизированных) указателей:

void *ptrLetters[4];
ptrLetters[0] = &lt.a;
ptrLetters[1] = &lt.b;
ptrLetters[2] = &lt.c;   //here is the problem
ptrLetters[3] = &lt.d;  //also here

И затем вы можете получить доступ к своим переменным следующим образом:

var1 = *((char*)ptrLetters[0]);

Обратите внимание, что для разыменования необходимо сначала привести указатели void к типу original . Преобразование в int затем выполняется неявно при присваивании.

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