结构和memcpy警告

时间:2015-07-31 10:06:09

标签: c structure microcontroller lpc flash-memory

我想将数据从闪存复制到RAM(微控制器)的结构中。我有结构初始化:

typedef struct Day{
    long AM : 24;
    long PM : 24;
}Day;

struct Data{
    unsigned long Lang   : 8;
    struct Day dawt[7];

}Data;

使用此功能从闪存加载到RAM中

void LoadFromFlash(){
    int count;

    memcpy(Data.Lang, F_DATA, 1);
    for(count = 0; count < 7;  count++){

        memcpy(Data.dawt[count].AM, F_DATA, 3);
        memcpy(Data.dawt[count].PM, F_DATA, 3);
    }
}

我收到警告:

passing argument 1 of 'memcpy' makes pointer from integer without a cast

所有mempcy功能

passing argument 2 of 'memcpy' makes pointer from integer without a cast

表示#define语句

#define F_DATA      0x00006000

出了什么问题。

3 个答案:

答案 0 :(得分:1)

正如我们从memcpy()语法中看到的那样,

void *memcpy(void *dest, const void *src, size_t n);

第一个和第二个参数应该是void *类型。

现在,假设Lang是结构变量Data的成员变量,并且您有一个像

这样的定义
 Data Data;

Data.Lang long类型的成员变量,而不是它的地址。您至少需要使用&Data.Lang

也就是说,如果是文字,就像0x00006000不表示地址一样,你需要像(void *)0x00006000一样强制转换它,使其像地址一样解释。

答案 1 :(得分:1)

我对你问题中的代码感到困惑,所以我可能会误解。但是如果Data是结构的RAM副本,并且在F_DATA表示的地址处有相同结构的flash副本,那么你应该可以做一些简单的事情:

void LoadFromFlash(){
    Data = *((struct Data *)F_DATA);
}

答案 2 :(得分:0)

正如其他人所指出的,memcpy函数对地址感兴趣(例如&amp; variable)。但是,正如您在评论中指出的那样,您收到以下错误消息:

cannot take addres of bit-field 'Lang'

原因是:

  

因为位字段不一定从字节的开头开始,所以不能获取位字段的地址。指针字段的指针和非const引用是不可能的。   位字段没有地址 - 您不能指向它们或它们的数组。

但是,我会尝试查看是否有解决方法。但是现在这应该足够了。

编辑: 你是那个在闪存中存储数据的人吗?

然而,创建一个联盟。在union中创建一个struct。将闪存中的3个字节复制到't'Day.AM中。然后从't'Day.bitfieldAM.AM

中读取值
typedef union
    {
    struct
    {
        long AM:24;
        long: 8;
    }bitFieldAM;
    long AM;

    struct
    {
        long PM:24;
        long: 8;
    }bitFieldPM;
    long PM;

}tDay;