首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C编程:当将2D数组作为const函数参数传递时,如何消除QAC警告?

C编程:当将2D数组作为const函数参数传递时,如何消除QAC警告?
EN

Stack Overflow用户
提问于 2019-02-18 15:38:51
回答 1查看 1.7K关注 0票数 1

我希望将一个2D数组传递给一个函数,并且数组的值将不会在该函数中被修改。所以我正在考虑这样做:

代码语言:javascript
复制
#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;
}

但是,当我启用depth 5 QAC设置时,它给了我QAC错误,因为我把它放在上面的代码注释中:

// Message 0432: C函数参数不具有兼容的指针类型。

如果删除函数声明和定义中的const,则函数如下:

代码语言:javascript
复制
static INT8 TwoDimArrayConst(INT8 ai_Array[2][2]);

此错误将消失,但还会出现另一个错误,即:

指针参数'ai_Array‘所寻址的对象没有>修改,因此指针可以是’指向const的指针‘类型。

那么,如何解决这一困境呢?我不能将ai_Array定义为主函数中的const数组,因为其他一些函数可能仍然希望修改该值。另外,我正在寻找的解决方案仍然是在函数中保持双括号(不需要将行大小和列大小作为单独的参数传递),而不是将其视为一维数组。

EN

回答 1

Stack Overflow用户

发布于 2019-02-19 01:51:48

下列拟议守则:

  1. 使用C库函数而不是windows函数,因为我运行的是linux,而不是windows
  2. 执行所需的功能
  3. 干净地编译
  4. 利用数组,在C中,在内存中连续排列
  5. 利用“访问数组名称会降低到数组的第一个字节的地址”。
  6. 移除所有不需要的大括号(这些大括号除了乱七八糟的代码外什么也不做)
  7. 文档为什么包含每个头文件
  8. 将数组的大小作为参数传递给被调用的函数(应该始终这样做,或者在数组的内容中包含某种“标记”)
  9. 所有这些都允许将数组视为一维数组。
  10. 一旦遇到终止条件,就会中断被调用函数中的循环。

BTW:头文件:windows.h是不可移植的

现在,拟议的守则:

代码语言:javascript
复制
//#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;
}

运行拟议的代码将导致:

代码语言:javascript
复制
1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54750704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档