马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 几度十八 于 2014-2-24 10:06 编辑
2014-2-19 问题:定义函数f(),其形参是float型,现在想通过函数f()调用先前定 义的整型数,通过调试总结出如下一些经验,有的地方尚需要官方 或者资深高手给予指点。 #include "stdio.h" #include "stdlib.h" #define N 8 float Buf[N]; unsigned int *Ptr;
void f(float x[N]) { int i; for(i=0;i<N;i++) { x=x*i; printf("%f\n",x); } }
void main(void) { int i; Ptr=NULL; //NULL在文件stdio.h中定义过。 Ptr=(unsigned int *)malloc(N*sizeof(int)); //注意一定是要开辟N个int型的字节长度,不然编译会出错。 //printf("%ld\n",Ptr); for(i=0;i<N;i++) { *(Ptr+i)=i; } for(i=0;i<N;i++) { Buf = *(Ptr+i); }
//下面调用函数f 处理外部RAM中的数 f((float *)(Ptr)); //请问:这样调用函数有问题吗? //f(Buf); //这样调用则不会有问题。 } 说明:若这样调用函数:f((float *)(Ptr)),则输出结果如下图A1所示:
A1
若这样调用函数f(Buf),则输出如下图所示A2:
A2
这说明像f((float *)(Ptr))这样调用函数是有问题的,具体原因就慢慢体会吧,我暂时也不能明确道出个所以然来。 后来我又调试发现:如果存储的时候也是定义Ptr为float型指针的,那么输出时调用f((float *)(Ptr))便可正确输出结果,而存储时是以unsigned int型指针存储的,则调用的时候应该这样调用:f((*unsigned int *)Ptr) 。
2014-2-22 对于上述问题,后来我又想到是否可以通过结构体来定义对应的变量,结果还是不行。 #include "stdio.h" #define N 8 union BufRam { unsigned intIntRam; float FloatRam; }Buf[N]; void f(float x[N]) { int i; for(i=0;i<N;i++) { x=x*i; printf("%f\n",x); } }
void main(void) { int i; for(i=0;i<N;i++) { Buf.IntRam=i; } for(i=0;i<N;i++) { //Buf.FloatRam=Buf.IntRam; //若增加这条语句,则下面的处理即可成功了。 }
//下面调用函数f 处理外部RAM中的数 f(&(Buf[0].FloatRam)); //请问:这样调用函数有问题吗? } 运行结果同上面第一幅图A1,
若调用程序中的这条语句Buf.FloatRam=Buf.IntRam,则运行结果同上面第二幅图A2。
这说明即使是定义结构体类型也是不行的啊,因为整型变量与浮点型变量的存储结构是不同的,这一点是我经过多天的理解自己得出的,其可靠性尚需官方或者资深工程师明确说明。 |