2017-06-27 107 views
1

我不明白为什么出现上述错误以及如何解决该错误。请帮忙。为什么会出现错误:从类型'UINT8 *'分配类型'P_Name_t'时出现不兼容类型

//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属于同一类型。我不知道我是否在这里失去了一些东西。请解释。

+0

1. C编程的第一条规则**不要**'typedef'指针。 2. C编程的第二条规则**不要使用'_t'作为自定义类型的名称(参见POSIX)。 3.第三条规则 - 见1和2. – 0andriy

+0

请[mcve]。随着你所提供的,有太多的猜测正在进行。 – Yunnosch

+4

@ 0andriy:我同意第一条规则,而不是第二条规则,这对POSIX程序员来说是一个规则,并且C之外还有C。我会说第二个规则是:**不要**'typedef'数组! – rodrigo

回答

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

[...] why i get the error[?] The LogEntry->NameOfPart is of type P_Name_t and PN_ChipID[0].NameOfPart is of the same type.

P_Name_t是一个数组,即5 unit8_t

PN_ChipID[0].NameOfPartP_Name_t类型。

所以这条线

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

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

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

+0

为了这个线程和未来的答案寻求者的利益。'LogEntry-> NameOfPart [1]','LogEntry-> NameOfPart [2]','LogEntry-> NameOfPart [5],LogEntry-> NameOfPart [ 3]','LogEntry-> NameOfPart [4]','LogEntry-> NameOfPart [5]'。 'PN_ChipID [0] .NameOfPart'类似于'PN_ChipID [0] .NameOfPart [0]','PN_ChipID [0] .NameOfPart [1]','PN_ChipID [0] .NameOfPart [2]'等等。所以复制它的方法是通过元素'PN_ChipID [0] .NameOfPart [i] = LogEntry-> NameOfPart [i];' – newb7777

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()或任何其他方法来做到这一点。

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]; 
} 
相关问题