为什么会出现错误:从“UINT8 *”类型分配类型“P_Name_t”时出现不兼容的类型

时间:2017-06-27 19:18:26

标签: c arrays struct assignment-operator

我不明白为什么我收到上述错误以及如何修复它。请帮忙。

//STRUCTURES
typedef UINT8 P_Name_t[5];
typedef UINT8 ChipSN_t[3]; 

typedef struct                   
{  
   ChipSN_t  ChipSN; 
   <other members>   
} ChipIdent_t;


typedef struct Data_t              
{ 
   ChipIdent_t      ReadOnlyMemID;
    <other members>   
} Data_t;


typedef struct                
{
   P_Name_t NameOfPart;   
   <other members>
} Log_t;

Data_t     Data_Src;

typedef struct
{
   P_Name_t       NameOfPart;           
   ChipSN_t       ChipSN;   
}PartNum_ID_t;


//VARIABLE DECALARTION
PRIVATE PartNum_ID_t PN_ChipID[12]; 
PRIVATE Log_t   *LogEntry = NULL;               


//Usage in code
PN_ChipID[0].NameOfPart = LogEntry->NameOfPart; 
PN_ChipID[0].ChipSN = Data_Src.ReadOnlyMemID.ChipSN;

我不明白为什么会收到错误。 LogEntry->NameOfPart类型为P_Name_tPN_ChipID[0].NameOfPart属于同一类型。我不知道我在这里遗失了什么。请解释。

3 个答案:

答案 0 :(得分:2)

除了将它隐藏在复杂的结构和指针之外,
你基本上是想这样做:

#include <string.h>

int main(void)
{
    char a[5];
    char b[5]={'a', 'b', 'c', 'd', 'e'};

    // version 1 works
    memcpy(a, b, sizeof(b)); // assuming that a and b are same size.

    // version 2 gives the same error as you quote
    //a=b;

    return 0;    
}

它给出了同样的错误。 虽然用作R值的数组标识符会衰减为指针, 你不能“将指向数组的指针”写为L值。

此外,你想达到什么目的? 你无论如何需要做的是将一个数组的内容复制到另一个数组。 使用memcpy()或任何其他方法来做到这一点。

答案 1 :(得分:2)

incompatible types when assigning to type 'P_Name_t' [...]
     

[...]为什么我收到错误[?] LogEntry->NameOfPart的类型为P_Name_t,而PN_ChipID[0].NameOfPart属于同一类型。

P_Name_t是一个数组,即5 unit8_t

PN_ChipID[0].NameOfPart的类型为P_Name_t

所以这一行

PN_ChipID[0].NameOfPart = LogEntry->NameOfPart;

尝试分配给一个数组,即PN_ChipID[0].NameOfPart

在C中,不可能分配给数组,因此编译上述行时出错。

答案 2 :(得分:0)

为了这个主题和未来的答案寻求者的利益。 LogEntry->NameOfPart是一个包含5个元素的数组,即:

LogEntry->NameOfPart[0]
LogEntry->NameOfPart[1] 
LogEntry->NameOfPart[2] 
LogEntry->NameOfPart[3]
LogEntry->NameOfPart[4]

PN_ChipID[0].NameOfPart类似

PN_ChipID[0].NameOfPart[0] 
PN_ChipID[0].NameOfPart[1]
PN_ChipID[0].NameOfPart[2]
PN_ChipID[0].NameOfPart[3]
PN_ChipID[0].NameOfPart[4]

因此,复制它的方法是通过循环复制元素

来运行它
for i=....
{
  PN_ChipID[0].NameOfPart[i] = LogEntry->NameOfPart[i];
}