TI中文支持网
TI专业的中文技术问题搜集分享网站

28069指针赋值问题

_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

赞(0)
未经允许不得转载:TI中文支持网 » 28069指针赋值问题
分享到: 更多 (0)