Типы индексов массива и предупреждения (752) в XC8 v2.10 C99 - PullRequest
0 голосов
/ 17 апреля 2020

Первый вопрос, так что я надеюсь, что он понятен!

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

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)

Пример проекта

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Если вы посмотрите на руководство пользователя XC8 (у меня это 1.42 на стр. 149), там написано, что значение int равно 16 битам, поэтому, по предположению, значение по умолчанию int равно 16 битам.

  1. Добавьте ULL в конце объявлений
  2. При сравнении с 32 битами используйте 0ULL.
0 голосов
/ 17 апреля 2020

Это предупреждение указывает на строку, где я получаю доступ к членам массива с индексом типа size_t. Похоже, что тип, используемый компилятором для индексов массива, не является константным и фактически зависит от размера массива.

C не имеет никакого смысла в присущем типе индекса массив. Доступ к массиву разрешается через выражение индекса любого целочисленного типа, и это не подразумевает какого-либо преобразования индекса в определенный целочисленный тип.

Я схожу с ума или нашел какой-то Интересная причуда с оптимизацией?

Я думаю, что вы обнаружили причуду компилятора, но неясно, связано ли это с оптимизацией. Также не ясно, сигнализирует ли предупреждение о каком-либо истинном риске. Однако с точки зрения языка C я не вижу ничего плохого в фрагментах кода, которые вы разместили ни по отдельности, ни вместе, в C99 или более поздней версии.

...