Nano Hash - криптовалюты, майнинг, программирование

Недопустимый тип в аргументе спецификатора формата printf и дополнительный аргумент в спецификаторе формата printf

Я отлаживал этот код RTOS в Coverity и столкнулся с несколькими небольшими ошибками. Ошибки говорят сами за себя, поскольку они являются ошибками спецификатора формата. Обе ошибки связаны с основной функцией. Первая ошибка в строке:

RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);

Ошибка: неверный тип в аргументе описателя формата printf (PRINTF_ARGS) invalid_type: результат аргумента описателя формата %X должен был иметь тип unsigned int, но имеет тип unsigned long.

Вторая ошибка в строке:

RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);

Ошибка: дополнительный аргумент для описателя формата printf (PRINTF_ARGS) дополнительный_аргумент: этот аргумент не использовался строкой формата: статус.

Я не уверен, как передать дополнительный аргумент, поскольку RTOS_TEST принимает один аргумент. Пожалуйста, скажите мне, что я делаю неправильно.

#if !defined(__arc__)
   #define RTOS_TEST(...) printf(__VA_ARGS__)
#else
   #define RTOS_TEST(...)
#endif

typedef uint_32  _mqx_uint, _PTR_ _mqx_uint_ptr;
typedef uint32_t Status_t;

void SECTION_CODE("CODE_SLOW") WrappersTest(uint_32  parameter)
{
   _lwmem_pool_id lwmem_pool_id;
   pointer        error_ptr;
   pointer        error2_ptr;
   Status_t       status;
   _mqx_uint      result;
   BOOL           fail = FALSE;

   RTOS_TEST("Start MQX integrity tests ...\n");

   TestQueue();
   TestLightWeightSemaphore();
   TestMutexAPI();
   TestLightWeightEvent();
   TestFastMessageQueue();
   TestLightWeightMemory();

#if defined(MQX_TEST_EVENT_TEST)
   RTOS_TEST("Calling _event_test ..."); fflush(stdout);
   result = _event_test(&error_ptr);

   if (result != MQX_OK)
   {
      RTOS_TEST(" ***FAILED*** _event_test: 0x%08X\n", result);
      fail = TRUE;
   }
   else
   {
      RTOS_TEST("PASSED!\n");
   }
#endif // MQX_TEST_EVENT_TEST

status = RTOS_MutexInit(&testMutex, (uint8_t*)Name);

if (status != STATUS_OK)
{
   RTOS_TEST("MQX init mutex FAILED: 0x%08X\n", status);
}

for (; loopCount > 0; loopCount--)
{
   status = RTOS_MutexLock(&testMutex);

   if (status != STATUS_OK)
   {
      RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
   }
}

int main()
{
   .........,
   RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);
   ..........
   if (status != STATUS_OK)
         {
            RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
         }
   ..........
   return 0;
}

  • Во второй строке формата отсутствует %. Ошибка в первой строке кажется самоочевидной: у вас есть аргумент неправильного типа. 17.06.2020
  • @AdrianMole Должен ли я использовать %u или 0x%08X в первом 17.06.2020
  • Используйте 0x%08lX для беззнакового длинного целого числа. (обратите внимание, что добавлена ​​строчная буква L). 17.06.2020
  • @AdrianMole, но это не 0x%08lX без знака. Он запрашивает беззнаковое целое число. И что, если я напишу L в верхнем регистре, какая разница? 17.06.2020

Ответы:


1

В этом звонке

RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);

вы как минимум забыли указать символ '%' перед спецификатором формата 'X' Например "0x%08X". Таким образом, компилятор выдает ошибку, ссылаясь на аргумент status, что есть избыточные аргументы.

В этом звонке

RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);

вы должны указать модификатор длины 'l'.

Например

RTOS_TEST(" Error = %#lX, pool = %#lX\n", result, (_mqx_uint)error_ptr);

Обратите внимание, что 0x писать не нужно. Вместо этого вы можете использовать флаг '#'. Если вы хотите иметь префикс '0x', используйте спецификатор формата нижнего регистра 'x' like"%#lx". Otherwise use the upper case format specifier'X'like"%#lX"`.

17.06.2020

2

"MQX lock mutex FAILED: 0x08X\n", status просто отсутствует "%", на который также ответил @Vlad из Москвы.
Хорошо, что в OP много предупреждений/ошибок включено.


Что касается несоответствия типов, используйте соответствующий спецификатор печати.

Пример: поскольку status является uint32_t, используйте "%" PRIX32

#include <inttypes.h>

typedef uint32_t Status_t;
Status_t       status;

// RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
RTOS_TEST("MQX lock mutex FAILED: 0x%08" PRIX32 "\n", status);
17.06.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..