KEIL,C51,C251 报错 C188

同样一段代码, 在KEIL C51 编译通过。 KEIL C251 编译报错。 这个错误是什么意思。
望解惑

/--------------分割线---------------------------/

img

img

keil C51 常见错误和警告
可以借鉴下
https://blog.csdn.net/tianpu2320959696/article/details/121571105

这是因为C51和C251的数据定义不一样啊,为啥要用C251取编译C51的程序昵

回答引用ChatGPT:
KEIL C251中的错误消息“warning C188:'parameter 2':value truncated”表示传递给函数的第二个参数被截断,因为它大于参数的数据类型。在这种情况下,当将第二个参数定义为uint8_t时,它是一个8位数据类型,它只能保持255(0xFF)的最大值,因此如果传递给函数的值超过255,它将被截断并导致此警告消息。

要解决此问题,您可以将第二个参数的数据类型更改为uint16_t,或者确保传递给函数的值不超过255的最大值。

以下内容部分参考ChatGPT模型:
根据错误提示,C188是C251编译器的一个错误代码,表示 "re-entrancy code detected",也就是发现了可重入代码。这通常是由于在中断服务程序中调用了不可重入的函数导致的。

解决思路:

  1. 检查中断服务程序中是否调用了不可重入的函数,如果有,可以使用可重入的函数替代。可重入函数是在调用时不会影响到其他代码的函数。
  2. 检查是否有多个中断服务程序在同时使用同一个资源,导致资源冲突。如果有,可以使用信号量、互斥量等机制来保证资源的互斥访问。
  3. 检查是否使用了递归函数,如果有,可以使用循环来替代递归函数。

示例代码:

//错误示例,中断服务程序中调用了不可重入的函数
void interrupt_service() {
  int x = rand(); //不可重入函数
  //...
}

//修改后的示例,中断服务程序中调用了可重入的函数
void interrupt_service() {
  int x = rand_r(); //可重入函数
  //...
}

//示例,使用互斥量保证资源互斥访问
void interrupt_service() {
  mutex_lock(); //获取互斥量
  //使用共享资源
  mutex_unlock(); //释放互斥量
}

//示例,使用循环替代递归函数
int factorial(int n) {
  if(n == 0) {
    return 1;
  }
  return n * factorial(n-1); //递归调用
}

//修改后的示例,使用循环
int factorial(int n) {
  int result = 1;
  for(int i = 1; i <= n; i++) {
    result *= i;
  }
  return result;
}
  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:Keil- C51软件编译中错误解决办法
  • 除此之外, 这篇博客: 51单片机KEILC51的安装中的 二、 KEIL C51 软件安装 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1、软件包下载完成之后,我们双击 C51V901.exe 这个应用程序,弹出如下所示对话框。
    在这里插入图片描述
    点击 Next 按钮。 弹出如下对话框。
    在这里插入图片描述
    打勾,然后点击 Next 按钮,弹出如下对话框
    在这里插入图片描述

    点击红框 1 选择软件安装的路径,我们这里在 D 盘内新建一个文件夹,命名为 KEILC51,将其安装到该文件夹内,方便软件的管理。
    特别要注意:
    (1)软件安装保存路径不能出现中文或者特殊字符,否则会出现很多奇怪的错误,到时候很难找问题。
    (2)不要将 KEIL5 软件和 KEIL4 或者 51 的 KEIL 安装在一个文件夹内。
    然后点击 Next ,弹出如下的对话框。
    在这里插入图片描述

    在红色框 1 和 2 中我们随便输入一些东西, 我们这里输入数字 666, 当然也可以输入空格, 但是一定要输入, 否则红色框 3 就一直是灰色状态, 输入完成后点击 Next, 弹出如下对话框。
    在这里插入图片描述
    说明 KEIL C51 软件正在安装,只要等一段时间即可,安装完成以后会出现如下界面。
    在这里插入图片描述
    点击 Finish 完成安装。KEIL C51 安装完成后在电脑桌面上一般会有一个快捷方式,如下所示:
    在这里插入图片描述

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
C188错误在KEIL C251中是指输出格式字符串中格式说明符与关联参数类型不匹配。通常在printf函数或类似函数中出现。

例如,如果你使用了"printf("%d",i);"来输出一个整数i,但实际上i是一个长整型,则会出现C188错误。

解决方法是将格式说明符修改为匹配的类型。对于上述例子,可以将代码改为"printf("%ld", i);"。

需要注意的是,C188错误可能会和其他错误一起出现,因此需要仔细检查代码以确定哪个错误导致了编译错误。

如果您能提供出错的代码和详细的错误信息,我可以更具体地帮您解决问题。
如果我的回答解决了您的问题,请采纳!

C51的库与C251的不一样,当然朋友你如果非要这么用,可以自己添加个.h文件,把它定义进去即可,望采纳谢谢啦

您好,根据提供的信息判断,你这改成uint8_t的话就办法按照原先的方式发送高8位和低8位了。你使用uint8_t就溢出了,无法满足原先的使用要求。望采纳~~谢谢啦

img

该回答引用ChatGPT
根据你提供的截图,KEIL C251编译器报错C188,提示"illegal operand of unary NOT",问题原因是C251编译器语法分析器不能识别该段代码中的语法。

根据提示,我们可以看到出错的行是“if(!g_NewFollow_Flag)”,这里“!”表示逻辑非,用于取反操作。而C251编译器中这个操作符有一定限制,只能应用于整型数据类型,而在该段代码中,g_NewFollow_Flag 的数据类型为unsigned char,不是整型。

解决这个问题的方法是将g_NewFollow_Flag的数据类型更改为int或者将“!”操作符改为其他逻辑运算符,比如“~”。以下是两种解决方法:

方法1:将g_NewFollow_Flag的数据类型更改为int

c
int g_NewFollow_Flag; //将数据类型改为int

...
if(!g_NewFollow_Flag)
...


方法2:将“!”操作符改为其他逻辑运算符“~”

c
unsigned char g_NewFollow_Flag;

...
if(~g_NewFollow_Flag)
...


以上是两种解决方法,希望可以帮助你解决问题。