Программирование на C: Как избавиться от предупреждения QAC при передаче 2D-массива в качестве аргумента функции const? - PullRequest
0 голосов
/ 18 февраля 2019

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

#include <Windows.h>

static INT8 TwoDimArrayConst(const INT8 ai_Array[2][2]);   

int main(void)
{
        INT8 ai_Array[2][2]       = { { { 1 }, { 2 } }, { { 3 }, { 4 } } };

  (void)TwoDimArrayConst(ai_Array);                           // Message 0432: [C] Function argument is not of compatible pointer type.

  return 1;
}

static INT8 TwoDimArrayConst(const INT8 ai_Array[2][2])
{
  INT8 test = 0;
  for (INT8 i = 0; i < 2; i++)
  {
    for (INT8 k = 0; k < 2; k++)
    {
      if (ai_Array[i][k] > 0)
      {
        test = 1;
      }
    }
  }
  if (test == 0)
  {
    test = 2;
  }

  return test;
}

Однако, это дало мне ошибку QAC, когда я включил настройку глубину 5 QAC, поскольку я добавил код комментария выше:

// Message 0432: [C] Function argument is not of compatible pointer type.

Если я уберу const в объявлении и определении функции, функция будет выглядеть так:

static INT8 TwoDimArrayConst(INT8 ai_Array[2][2]);

эта ошибка исчезнет,но будет еще одна ошибка:

> The object addressed by the pointer parameter 'ai_Array' is not
> modified and so the pointer could be of type 'pointer to const'.

Так как решить эту дилемму?Я не могу определить ai_Array как массив const в основной функции, так как некоторые другие функции все еще могут захотеть изменить значение.Кроме того, я ищу решение, которое по-прежнему поддерживает двойные скобки (не нужно передавать размер строки и размер столбца в качестве отдельных аргументов) в функции, а не обрабатывать ее как одномерный массив.

1 Ответ

0 голосов
/ 19 февраля 2019

следующий предложенный код:

  1. использует функции библиотеки C, а не функции Windows, так как я работаю на Linux, а не Windows
  2. выполняет желаемую функциональность
  3. безупречная компиляция
  4. использует преимущества массивов в C, которые последовательно размещаются в памяти
  5. использует "доступ к имени массива, уменьшающемуся до адреса первого байтамассив "
  6. удаляет все ненужные скобки (которые ничего не делают, только загромождая код)
  7. документирует, почему каждый заголовочный файл включен
  8. передает размер массива какпараметр вызываемой функции (должен всегда либо делать это, либо включать какой-либо «маркер» в содержимое массива)
  9. все вышеперечисленное позволяет рассматривать массив как одномерный массив
  10. прерывает цикл в вызываемой функции, как только встречается условие завершения

Кстати: заголовочный файл: windows.h не является портабомle

и теперь предлагаемый код:

//#include <Windows.h>
#include <stdio.h>    // printf()
#include <stdint.h>   // int8_t


static int8_t TwoDimArrayConst( const int8_t *ai_Array, size_t size );   

int main(void)
{
    const int8_t ai_Array[2][2]       = { { 1, 2 }, { 3, 4 }  };

    int8_t returnValue = TwoDimArrayConst(( int8_t* const )ai_Array, sizeof( ai_Array) / sizeof( int8_t ));                           

    printf( "%d\n", returnValue );
    return 1;
}


static int8_t TwoDimArrayConst( const int8_t *ai_Array, size_t size )
{
    int8_t test = 2;
    for ( size_t i = 0; i < size; i++)
    {
        if (ai_Array[i] > 0)
        {
            test = 1;
            break;
        }
    }

    return test;
}

Запуск предлагаемого кода приводит к:

1
...