我想在结构上将数据从flas复制到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对于所有的记忆函数
和
passing argument 2 of 'memcpy' makes pointer from integer without a castfor #define语句
#define F_DATA 0x00006000怎么了。
发布于 2015-07-31 18:10:44
正如我们从memcpy()语法中看到的,
void *memcpy(void *dest, const void *src, size_t n);第一个和第二个参数的类型应该是void *。
现在,假设Lang是结构变量Data的成员变量,并且您有如下定义
Data Data;Data.Lang is long类型成员变量,而不是它的地址。你至少需要使用&Data.Lang。
也就是说,在文字类型的情况下,例如0x00006000并不表示地址,您需要将其转换为(void *)0x00006000类型,以使其解释为地址。
发布于 2015-07-31 22:41:31
我被你问题中的代码搞糊涂了,所以我可能会误解。但是,如果Data是结构的内存副本,并且在F_DATA表示的地址上有相同结构的闪存副本,那么您应该能够做如下简单的事情:
void LoadFromFlash(){
Data = *((struct Data *)F_DATA);
}发布于 2015-07-31 19:20:51
正如其他人所指出的,memcpy函数对地址感兴趣(例如&variable)。但是,正如您在注释中所指出的,您会收到以下错误消息:
cannot take addres of bit-field 'Lang'原因是:
因为位字段不一定从字节的开头开始,所以不能获取位字段的地址。位字段的指针和非常数引用是不可能的。位字段没有地址-您不能有指向它们的指针或它们的数组。
但是,我将尝试查看是否有解决方法。但就目前而言,这应该足够好了。
编辑:你是那个将数据存储在闪存中的人吗?
但是,要创建一个联合。在联合中创建一个结构。将闪存中的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;https://stackoverflow.com/questions/31743559
复制相似问题