当前位置:   article > 正文

随随便便犯下的C语言错误_uint32 a = (uin32)(float32 b * float32 c) 静态检查报错

uint32 a = (uin32)(float32 b * float32 c) 静态检查报错

变量定义与强制类型转换

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    for((uint8_t) i = 0; i < 5; i++)
    {
        printf("variable i is : %d \n", i);
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

编译器提示

image-20210301122355619

问题分析

  变量没有定义?因为数据类型uint8_t 添加了个括号,而(type)表示强制类型转换,因此没有定义就调用,导致报错。

指针指向的地址

/* 数据打印函数指针 */
typedef void (*Print_Func)(const void *);

void int16_value_print(const void * value);
void uint32_value_print(const void * value);

void data_output(Print_Func print, const void * value)
{
    print(value);
}

/* 主函数 */
int main(void)
{
    // int16_t s16_temp_val[10] = {-255, 3442};
    // uint32_t u32_temp_val[2] = {85536, 96275};

    int16_t *s16_temp_val = -255;
    uint32_t *u32_temp_val = 85536;

    data_output(uint32_value_print, (void *)u32_temp_val);
    data_output(int16_value_print, (void *)s16_temp_val);

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

编译器提示

image-20210302141724833

问题分析

  函数参数传入的该是指针所指向的具体的地址,而非数据。同时地址处该存着有效的数据

  在上面中,给指针赋值的-255 和 85536都会被认为是一个地址,而且地址不能是个负值。

  解决方法是给变量赋值,然后将指针指向变量的地址。

    int16_t a = -255;
    uint32_t b = 85536;
    int16_t *s16_temp_val = &a;
    uint32_t *u32_temp_val = &b;
  • 1
  • 2
  • 3
  • 4

结构体数组在.h文件中定义

#define STRING(s)  #s

typedef enum
{
    state_white_red = 0,
    state_white_yellow,
    state_white_blue,
    state_white_orange,
}State;

typedef struct
{
    State sta;      ///< 状态对应的常量
    char *str;      ///< 状态对应的标识符(字符串)
} ComparisonInfo;

ComparisonInfo comparison_table[] =
{
    {state_white_red,       STRING(state_white_red)},
    {state_white_yellow,    STRING(state_white_yellow)},
    {state_white_blue,      STRING(state_white_blue)},
    {state_white_orange,    STRING(state_white_orange)},
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

编译器提示

statemachine.o:statemachine.c:(.data+0x0): multiple definition of `comparison_table'
  • 1

问题分析

  任何变量都不该写在.h文件中,但是我为了将用到的数据类型和函数相分开,就写在了.h 文件中

  还遇到一种情况,状态表是状态机数据类型的一部分,若将其分别写在.c 文件和 .h文件中,看起来也并不直观。

  解决方法是添加static , 将其声明为局部的

static ComparisonInfo comparison_table[] =
  • 1

文件和 .h文件中,看起来也并不直观。

  解决方法是添加static , 将其声明为局部的

static ComparisonInfo comparison_table[] =
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/329922
推荐阅读
相关标签
  

闽ICP备14008679号