Первый вопрос, так что я надеюсь, что он понятен!
Я инициализирую указатель на составной литерал, который является массивом структурных указателей. Затем я могу использовать этот указатель, как обычно для массива указателей.
typedef struct
{
uint32_t test1;
uint32_t test2;
uint32_t test3;
uint32_t test4;
uint32_t test5;
uint32_t test6;
uint32_t test7;
uint32_t test8;
uint32_t test9;
uint32_t test10;
uint32_t test11;
} TestStruct;
TestStruct* TestStructArray = (TestStruct[])
{
{
.test1 = 69,
},
{
.test1 = 69,
},
{
.test1 = 0,
},
};
Когда я пытаюсь выполнить l oop через этот массив позже, я использую переменную типа size_t для l oop счетчик и доступ к членам массива, используя обозначение массива [].
void main(void)
{
size_t ArrIdx = 0U;
while(TestStructArray[ArrIdx].test1 != 0U) \\\\\ <-- warning: (752) conversion to shorter data type
{
LocalTestFunction();
ArrIdx++;
}
}
Когда размер массива падает ниже некоторого порога размера, компилятор выдает следующее предупреждение: (752) преобразование в более короткое тип данных. Добавление большего числа членов в структуру или большего числа членов в массив структуры удаляет предупреждение. ie .. В этом примере инициализация другого члена массива удаляет ошибку компилятора.
Это предупреждение указывает на строку, где я обращаюсь к членам массива с индексом типа size_t. Кажется, что тип, используемый компилятором для индексов массива, не является константным, и фактически зависит от размера массива. Это делает очень трудным предотвращение усечения или неиспользуемой памяти.
Я скомпилировал этот тестовый код в совершенно новом проекте, и поведение остается.
Я схожу с ума или нашел какой-то интересный Привычка с оптимизацией?
Моя среда сборки выглядит следующим образом:
- MPLAB X v5.35
- XC8 v2.10
- C99 Standard и ссылка в C библиотеке
- Уровень предупреждения: -9
- Устройство: PIC18F46K20
- Оптимизация: Пробел (PRO)
Пример проекта