C 为什么会出现错误:从类型“UINT8*”分配给类型“P\u Name\u t”时,类型不兼容

C 为什么会出现错误:从类型“UINT8*”分配给类型“P\u Name\u t”时,类型不兼容,c,arrays,struct,assignment-operator,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 { ChipId

我不明白为什么我会出现上面的错误以及如何修复它。请帮忙

//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_t和PN_芯片ID[0]。NameOfPart的类型相同。我不知道我是否遗漏了什么。请解释一下

除了隐藏在复杂的结构和指针后面, 您基本上是在尝试这样做:

#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或任何其他方法来执行此操作。

除了将其隐藏在复杂的结构和指针后面, 您基本上是在尝试这样做:

#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或任何其他方法来实现这一点

[…]为什么会出现错误[?]日志条目->零件名称的类型为p_Name_t和PN_ChipID[0]。零件名称的类型相同

p_Name_t是一个数组,即5个单元8_t

PN_芯片ID[0]。零件名称的类型为p_Name\u t

所以这条线

PN_ChipID[0].NameOfPart = LogEntry->NameOfPart;
尝试分配给数组,即PN_芯片ID[0]。零件名称

在C语言中,不可能分配给数组,因此在编译上述行时会出现错误

[…]为什么会出现错误[?]日志条目->零件名称的类型为p_Name_t和PN_ChipID[0]。零件名称的类型相同

p_Name_t是一个数组,即5个单元8_t

PN_芯片ID[0]。零件名称的类型为p_Name\u t

所以这条线

PN_ChipID[0].NameOfPart = LogEntry->NameOfPart;
尝试分配给数组,即PN_芯片ID[0]。零件名称


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

为了这个线程和将来的答案搜索者的利益。LogEntry->NameOfPart是由5个元素组成的数组,即:

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

PN_芯片ID[0]。零件名称类似

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];
}

为了这条线索和未来的答案寻求者的利益。LogEntry->NameOfPart是由5个元素组成的数组,即:

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

PN_芯片ID[0]。零件名称类似

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];
}

1.C编程的第一条规则是不要键入def指针。2.C编程的第二条规则不使用_t作为自定义类型的名称,请参见POSIX。3.第三条规则-见1和2。请做一个。根据您提供的内容,猜测太多了。@0andriy:我同意第一条规则,而不是第二条,这是POSIX程序员的规则,POSIX之外还有C。我认为第二条规则是:不要键入def数组!。您正试图将UINT8*类型的值分配给UINT8[5]类型的左值。数组和指针不是一回事;赋值无效。当您试图用不必要的typedefing指针和数组混淆代码时,就会出现这种情况。1。C编程的第一条规则是不要键入def指针。2.C编程的第二条规则不使用_t作为自定义类型的名称,请参见POSIX。3.第三条规则-见1和2。请做一个。根据您提供的内容,猜测太多了。@0andriy:我同意第一条规则,而不是第二条,这是POSIX程序员的规则,POSIX之外还有C。我认为第二条规则是:不要键入def数组!。您正试图将UINT8*类型的值分配给UINT8[5]类型的左值。数组和指针不是一回事;赋值无效。当您试图用不必要的typedefing指针和数组混淆代码时,就会发生这种情况。为了这个线程和将来的答案搜索者的利益。LogEntry->NameOfPart是一个由5个元素组成的数组,即LogEntry->NameOfPart[0]',LogEntry->NameOfPart[1]',LogEntry->NameOfPart[2]',LogEntry->NameOfPart[3]',LogEntry->NameOfPart[4]',LogEntry->NameOfPart[5]'PN_芯片组[0]。零件名称“类似于”PN_芯片组[0]。零件名称[0],“PN_芯片组[0]。零件名称[1],“PN_芯片组[0]。零件名称[2]”等等。。因此,复制它的方法是通过一个循环,逐个元素PN_ChipID[0]复制元素;为了这条线索和未来的答案寻求者的利益。LogEntry->NameOfPart是一个由5个元素组成的数组,即LogEntry->NameOfPart[0]',LogEntry->NameOfPart[1]',LogEntry->NameOfPart[2]',LogEntry->NameOfPart[3]',LogEntry->NameOfPart[4]',LogEntry->NameOfPart[5]'PN_芯片组[0]。零件名称“类似于”PN_芯片组[0]。零件名称[0],“PN_芯片组[0]。零件名称[1],“PN_芯片组[0]。零件名称[2]”等等。。那么复制的方式是什么呢 这是通过一个逐元素PN_ChipID[0]复制元素的循环来运行它;