访问要比较的结构成员的元素

时间:2015-12-19 21:50:24

标签: c

问题:对于下面的代码,我试图将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)

1 个答案:

答案 0 :(得分:1)

  

我知道每当我打电话给结构成员时,实际上我就是这样   传递一个内存地址,例如logger-> Name将有一个内存   地址。与logger-> qty相同。

你的问题来自于这里的误解。它不是每当,而是(来自ISO / IEC 9899:201x):

  

除非它是sizeof运算符的操作数,_Alignof   运算符,或一元&运算符,或者是用于的字符串文字   初始化一个数组,一个类型为''数组 type ''的表达式   转换为类型为''指向 type ''的表达式   指向数组对象的初始元素,而不是   左值。

所以,您认为知道的内容适用于数组,但不适用于没有数组类型的左值,尤其不适用于logger->qtyLogger->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')作为内存地址,这对您的程序来说很可能是致命的,当然不是什么你要。