This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C123GH6PM:采样、累加、平均函数- CCS 警告

Guru**** 2605765 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/746769/ccs-tm4c123gh6pm-sample-accumulate-average-function---ccs-warning

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

您好!

我正在使用连接到 Launchpad 板的 mpu6050传感器。

读数噪声很大-因此、为了改善结果、我希望编写一个函数、该函数执行以下操作:

1.读取读数

2.累积(将新读数与所有历史读数之和相加)。

3.将累加总和除以读数的数量。

这就是我写的内容:

void sample_accumulation_average (int number_for_samples、float *加速计_aver[3]、float * gyro_aver[3])//函数作为指向3个元素
的数组的参数指针{
浮点加速计读数[3]、gyro_reading[3];
int sample 计数器;
int axy_number;
tMPU6050 g_sMPU6050Inst;// MPU6050传感器驱动程序结构。 "tMPU6050"在 mpu6050.h 文件中定义。
对于(SAMPLE_COUNTER = 0;SAMPLE_COUNTER < NUMBER_OL_SAMPples;SAMPLE_COUNTER ++)
{
MPU6050DataRead (&g_sMPU6050Inst、USER_MPU6050Callback、0);
while (!g_bMPU6050Done){}
MPU6050DataAccelGetFloat (&g_sMPU6050Inst、&accorum_reading[0]、&accorm_reading[1]、&accorm_reading[2]);
MPU6050DataGyroGetFloat (&G) sMPU6050Inst、&gyro_reading[0]、&gyro_reading[1]、&gyro_reading[2]);
对于(AXIC_NUMBER = 0;AXIC_NUMBER < 3;AXIC_NUMBER ++)
{
*加速计平均值[ AXIS 编号]=*加速计平均值[ AXIS 编号]+加速计读数[ AXIS 编号];//累加加速计读数
*gyro_average [ axy_number ]=*加速计_average [ axis _number ]+加速计读取[ axis _number ];//累加陀螺仪读数
}
}
对于(AXIC_NUMBER = 0;AXIC_NUMBER < 3;AXIC_NUMBER ++)
{
*加速计平均值[ AXIS 编号]=*加速计平均值[ AXIS 编号]/ NUMBER_OW_SAples;
*gyro_average [ axis _number ]=*gyro_average [ axis _number ]/ number_for_samples;
}
} 

这就是我在代码中调用函数的方式

 SAMPLE_accumulation_average (64,&fAccel,&fGyro);

我收到以下警告:

说明资源路径位置类型
"float (*)[3]"类型的#169-D 参数与"float **"类型的参数 main.c /PID 行186 C/C++问题不兼容

我犯了什么错误?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您会将浮点数数组与浮点数的指针数组混淆。 我假设 fAccel 和 fGyro 都定义为:

    fAccel[3]浮点;
    fGyro[3]; 

    我假设您要将指向这两个数组的指针传递给您的函数、并使用从 MPU-6050读取的平均值填充数组。 首先、当您调用函数时、数组名称(不带[])是数组的指针。 它与 fAccel[0]相同。 传递&fAccel 将创建地址的副本并将地址传递到地址(不是您想要的地址)。  

    因此、在例程中:

    void sample_accumulation_average (int number_for_samples、float *加速计_average、float * gyro_average)//函数作为指向3个元素
    数组的参数指针{
    浮点加速计读数[3]、gyro_reading[3];
    int sample 计数器;
    int axy_number;
    tMPU6050 g_sMPU6050Inst;// MPU6050传感器驱动程序结构。 "tMPU6050"在 mpu6050.h 文件中定义。
    对于(SAMPLE_COUNTER = 0;SAMPLE_COUNTER < NUMBER_OL_SAMPples;SAMPLE_COUNTER ++)
    {
    MPU6050DataRead (&g_sMPU6050Inst、USER_MPU6050Callback、0);
    while (!g_bMPU6050Done){}
    MPU6050DataAccelGetFloat (&g_sMPU6050Inst、&accorum_reading[0]、&accorm_reading[1]、&accorm_reading[2]);
    MPU6050DataGyroGetFloat (&G) sMPU6050Inst、&gyro_reading[0]、&gyro_reading[1]、&gyro_reading[2]);
    对于(AXIC_NUMBER = 0;AXIC_NUMBER < 3;AXIC_NUMBER ++)
    {
    加速计平均值[ AXIAL_NUMBER ]=加速计平均值[ AXIAL_NUMBER ]+加速计读数[ AXIAL_NUMBER ];//累加加速计读数
    gyro_average [ axis _number ]= gyro_average [ axis _number ]+ gyro_reading [ axis _number ];//累加 gyro 读数
    }
    }
    对于(AXIC_NUMBER = 0;AXIC_NUMBER < 3;AXIC_NUMBER ++)
    {
    加速计平均值[ AXIS 编号]=加速计平均值[ AXIS 编号]/ NUMBER_OW_SAples;
    gyro_average [ axy_number ]= gyro_average [ axis _number ]/ number_for_samples;
    }
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只需添加到 Bob 的注释中、如果要使用指针访问数组的元素、则执行如下操作:

    fAccel[3]浮点;
    fGyro[3]; 

    float * ptr;
    浮点 x;

    ptr = fAccel;// ptr 指向 fAccel 数组的第一个元素
    x =*(PTR+2);//将等同于 fAccel[2]的 fAccel 第三个元素的内容移动到 x

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的假设是正确的。

    我应该这么说?

    SAMPLE_accumulation_average
    (
    64 、
    fAccel[0]、
    fGyro[0])
    ; 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您可以按上述方式进行编写。 或者、您也可以像下面这样编写、因为数组是每个 C 定义的指针。

    SAMPLE_accumulation_average
    (
    64 、
    fAccel、
    fGyro
    );
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想用一个通过函数间接递增变量的简单示例巩固我对 Bob 所写内容的理解。
    //case 1 -外部变量不是数组元素:

    int x;

    void increment_inter间接(int * pointer_to non_array_elemet)

    * POINTER_TO_NON_ARRAGE_ELEMENT ++;
    ]

    间接增量(&x);



    //case 2 -外部变量是一个数组元素:

    //格式不正确:
    int x[3];

    void increment_inter间接(int * pointer_to non_array_element)

    * POINTER_TO_ARRAGE_ELEMENT [0]=* POINTER_TO_ARRAGE_ELEMENT [0]+ 1;
    ]

    increment_indirectly (& x [0]);

    情况2不正确的原因是、在 C 语言中、数组名称(在本例中为 x)在我们声明数组的时刻被隐式定义为指针。
    因此:
    * POINTER_TO_ARRAGE_ELEMENT [0]
    实际上是指向指针的指针、而不是指向数组元素的指针。

    我是对的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没错。

    unsigned int array[5];
    
    array[0]= 0;
    * array++;// array[0]现在等于1
    array[0]++;// array[0]现在等于2
    
    * array[0]++;//表示递增存储在地址2的数据 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只是不要混淆数组指针与数组指针之间的关系、这正是您以前使用的指针。

    此链接可能有用。
    www.tutorialspoint.com/.../c_array_of_pointers.htm