[Pointer]在C语⾔中进⾏float型与uint8型数组内存拷贝时出现
的问题与解决
问题描述:出现的问题⽐较奇怪,使⽤的是win7的64位操作系统下的KeiluVision4编译器,以兼容、管理员模式运⾏的,编写的程序是在ARM的硬件上运⾏的。由于需要在板上的flash存储芯⽚⾥⾯存储数据,数据是以字节的⽅式进⾏存储的,现在有⼀个float型的数据需要存储,于是声明⼀个临时数组变量⽤来存放从flash读取的字节内存,另外float型数据也是先将其4字节内存拷贝到该数组变量中,然后逐个字节存储到flash的。但是⼀些常见的使⽤⽅法进⾏内存拷贝时都出现了问题。
联合:⾸先考虑到union是各个成员共享内存的,于是可以定义⼀个4个元素的数组变量和⼀个float型变量:
union arr_to_f {
float x;
uint8 a[4];
}u1;
这样,要把float型数值存储到flash中时,可以给成员u1.x=…;赋值,然后将成员内数组a的四个元素存储到flash,读取时将flash中的值读到数组a中,然后直接使⽤成员x的值即可。⼀般这样做是可以的,但是我实际使⽤时,出了问题,先存储到flash,然后从flash读,再显⽰float型数值时,始终为0。
memcpy:使⽤string.h头⽂件中的memcpy函数,直接进⾏内存拷贝,memcpy原型如下:
void *memcpy(void *dest, const void *src, size_t n);
浮点型变量float
于是使⽤
memcpy((uint8*)&x,&a[0],sizeof(a));
道理是⼀样的,但是仍然显⽰的float值⼀直为0。
指针操作⼀:另外使⽤了x=*(float*)&a[0];这种指针操作⽅式,结果还是float型数值显⽰⼀直为0。
指针操作⼆:与指针操作⼀类型,但是反过来的意思,
for(i=0;i<4;i++){
*((uint8 *)&x + i) = *(&a[0] + i); // 逐个字节单元进⾏复制
}
使⽤这种⽅式时,⼀切就都正常了。
以上问题解决的思路都是⼀样的,但是前⾯⼏种都没有得到正确的结果,是Keil编译器的问题?但是Keil都⽀持这些操作的,另外之前在32位系统上使⽤Keil编程⽤的就是memcpy的⽅式⼜是可以的,难道还是在64位系统下兼容模式使⽤Keil编译器仍存在某些问题?还是⾃⼰的flash驱动有问题?希望在之后的时间能发现其原因。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。