_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Martin Yu:
变量rDal的定义是怎么样的?根据你的描述应该是指针变量,检查下re应该等于Dat[0]的值,因为Dat是数组名,指向第一个成员的地址Dat[0]。
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Greenery:
回复 Martin Yu:
我试过好几种方式赋值比如:
re=rDat[0];
re=*rDat;
re=(_iq)rDat[0];
这些都不行,都不是rDat[0]的值。
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Greenery:
回复 Martin Yu:
执行前
执行后
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Martin Yu:
回复 Greenery:
按照你的程序的意思我在F28335上试了下,是可以的:
_iq Data = 0;_iq *rDat = &Data;_iq Rel = 0;
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Greenery:
回复 Martin Yu:
你定义的变量和指针都是同一种类型的,之前我也有测试过同种类型的变量和指针是不会有问题的。
我用的两个指针其Dat是unsigned char型,rDat是_iq型。
因为我想实现数据类型的转换
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Martin Yu:
回复 Greenery:
楼主的意思是将一个 unsigned char 的数组内的值赋给一个_iq格式的变量re,希望这个过程中完成数据类型转换,是吧? 那代码中 *rDat = * Da)已经进行转换了。
最好把你的这部分代码贴上看下。谢谢!
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Greenery:
回复 Martin Yu:
_iq sEEPROM_Read_iq_Type (unsigned short adr){ unsigned char adrH,adrL,Dat[4];// unsigned short OverTimer=EEPROM_RW_OverTimerValue; _iq *rDat; _iq re=_IQ(0.0); rDat=(_iq *)Dat;
if(adr >= sEEPROM_Size) return 0x00;
adrL = adr & 0xFC; adrH = ((unsigned char)(adr >> 5) & AdrMaskH) | CMD_Read;
while(WriteState & sEEPROM_ReadState()) {// if(0 == OverTimer–)// return 0; }
sEEPROM_CS_L(); sEEPROM_TxRxByte(adrH); sEEPROM_TxRxByte(adrL); Dat[0] = sEEPROM_TxRxByte(EmptyData); Dat[1] = sEEPROM_TxRxByte(EmptyData); Dat[0] += (Dat[1]<<8); Dat[1] = sEEPROM_TxRxByte(EmptyData); Dat[2] = sEEPROM_TxRxByte(EmptyData); Dat[1] += (Dat[2]<<8); sEEPROM_CS_H();
re = rDat[0]; return re;}
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Greenery:
回复 Martin Yu:
您好!你有测试这个问题吗?程序我用了其他方发实现。但是这个赋值的问题还是存在,想弄个明白。希望你们能测试一下。
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Martin Yu:
回复 Greenery:
还没试,周末试下我们再讨论。
_iq sEEPROM_ReadFloat (unsigned short adr)
{
unsigned char adrH,adrL,Dat[4];
_iq *rDat=(_iq *)Dat;
_iq re=_IQ(0.0);
……
……
……
re = (_iq)(*rDat);
return re;
}
以上代码是一个完整的函数。在红色部分代码赋值时出现问题。变量re得到的值既不是rDat指向的地址,也不是rDat指向地址里的值。(是另外一个恒定值)
望高手指点。
Martin Yu:
回复 Martin Yu:
原因是char是16bit数据,而_iq是32bit的,所以直接将char型的数据赋给_iq的话会将高16位的其他数据串进来,验证如下:
unsigned char Dat[4] = {0x1,0x2,0x3,0x4};
_iq *rDat;_iq re;
re=_IQ(0.0); rDat=(_iq *)Dat;
re = rDat[1];
结果是: re = 0x00040003