问题:对于下面的代码,我试图将Logger-> Name的各个元素而不是整个数组与Base_PN变量进行比较。有人可以就我如何改变提出一些建议,以便我能做到这一点。感谢。
下面的代码是我的logger.h文件,其中我声明了一个名为partNum_t的新型8位UINT8数组,它是10字节宽或有10个元素。然后我把它作为结构的一部分或称为记录器的结构的一部分。我知道每当我调用结构成员时,实际上我实际上是在传递一个内存地址,例如logger-> Name将有一个内存地址。与logger-> qty相同。
//logger.h
typedef UINT8 partNum_t[10];
typedef struct
{
partNum_t Name;
UINT16 qty;
} Logger;
UINT8* connected(void); //Function Prototype
以下代码是logger.c文件。
#include "logger.h"
//Please note that although the type for Logger->Name is partNum_t the PIC32 MPLAB compiler throws errors if the partNum_t* is used instead of UINT8* as it is on the next line.
UINT8* Get_PN (void)
{
return (Logger->Name);
}
下一个文件是使用该信息。我称之为DisplayInfo.c
#include "logger.h"
..
..
partNum_t Base_PN={'1','2','3','4','5','-','7','8','9','0'};
UINT8* RawValue_PN;
BOOL setFlag;
void use_PN()
{....
...
RawValue_PN = Get_PN();
if ( RawValue_PN && !memcmp(RawValue_PN, Base_PN, 10))
{
{
setFlag=1;
}
else
{
setFlag=0;
}
}
以上所有方法都运行正常,但我只对比较最后4位数字' 7'' 8',' 9',' 0'单独的Base_PN。 partNum_t Base_PN = {' 1',' 2',' 3',' 4',' 5',& #39; - '&#39 7'&#39 8'' 9'' 0'}; 我怎样才能做到这一点。
我试过 UINT8 Get_PN6(无效) { return(Logger-> Name [6]); } 并在DisplayInfo.c文件中
.....
partNum_t Base_PN={'1','2','3','4','5','-','7','8','9','0'};
BOOL setFlag;
UINT8 RawValue_PN6, BL6_current;
RawValue_PN6 = Get_PN6();
if (BL6_current != RawValue_PN6) //So that code only runs when there is change.
{
if (RawValue_PN6==3)
{
setFlag=1;
}
else
{
setFlag=0;
}
BL6_current = RawValue_PN6;
}
但我得到一个警告:指针与此行的整数之间的比较
if (BL6_current != RawValue_PN6)
答案 0 :(得分:1)
我知道每当我打电话给结构成员时,实际上我就是这样 传递一个内存地址,例如logger-> Name将有一个内存 地址。与logger-> qty相同。
你的问题来自于这里的误解。它不是每当,而是(来自ISO / IEC 9899:201x):
除非它是
sizeof
运算符的操作数,_Alignof
运算符,或一元&
运算符,或者是用于的字符串文字 初始化一个数组,一个类型为''数组 type ''的表达式 转换为类型为''指向 type ''的表达式 指向数组对象的初始元素,而不是 左值。
所以,您认为知道的内容适用于数组,但不适用于没有数组类型的左值,尤其不适用于logger->qty
和Logger->Name[6]
转换为
存储在指定对象中的值。
我只想比较最后4位数字' 7'' 8'' 9'' 0'的 Base_PN单独。 partNum_t Base_PN = {' 1'&#39 2'&#39 3'' 4'&#39 5'&# 39; - '&#39 7'&#39 8'' 9'' 0'};我怎样才能实现 此
您可以使用
UINT8 *Get_PN6(void) { return &Logger->Name[6]; }
或
UINT8 *Get_PN6(void) { return Logger->Name+6; }
(相当于),或者,如Dmitri建议的那样,留在RawValue_PN = Get_PN()
和
memcmp(RawValue_PN+6, Base_PN+6, 4)
这样可行,但我需要单独访问每个字节,所以我可以 比较每一个,然后显示个性。
您已经通过RawValue_PN[6]
,RawValue_PN[7]
,Base_PN[6]
等对个人进行了个人访问。
我摆脱了关于指针和整数之间比较的警告 通过使用类型转换
这种方式错了。通过将UINT8
转换为UINT8 *
,您将重新解释字符值(例如' 7')作为内存地址,这对您的程序来说很可能是致命的,当然不是什么你要。