• 11783阅读
  • 12回复

[讨论]这个是QString::arg()转换的bug吗,有人遇到吗 [复制链接]

上一主题 下一主题
离线wxyao
 

只看楼主 正序阅读 楼主  发表于: 2014-03-26
使用Qt的tr("%1").arg(...)转换double到QString出错,起初以为是内存越界,但是后来用sprintf转换的结果跟它的结果比较,据此判断应该是Qt的Bug。
    有没有朋友也遇到这样的情况呢? 我的开发环境为vs2005 + Qt-vs-addin,使用Qt4.5.2 和Qt4.8.4都有这样的问题


代码片段:


  1. char buffer[100] = {0};  
  2. QString qsTurnoverVol;  
  3.   
  4. qsTurnoverVol = tr("%1").arg(price.TurnoverVol, 0, 'f', 0);  
  5.   
  6. //test bug  
  7. {  
  8.     sprintf(buffer, "%.0f", price.TurnoverVol);  
  9.     QString sBuffer(buffer);  
  10.     if (qsTurnoverVol != sBuffer)  
  11.     {  
  12.         QString sInfo = QString("'%1' vs '%2'").arg(qsTurnoverVol).arg(sBuffer);  
  13.         static int times = 5;  
  14.         if (times-- > 0)  
  15.             MessageBox(0, sInfo.toStdWString().c_str(), TEXT("出错啦"), MB_OK);  
  16.     }  
  17. }  



对话框输出:
'2590:'  vs '25910'
'2600:'  vs '26010'






离线wxyao

只看该作者 12楼 发表于: 2014-04-01
回 dbzhang800 的帖子
dbzhang800:但是你没有给出任何有效证据来证明你的观点。 (2014-03-28 09:40)

你说的是,我的程序运行时确实出现了那样的BUG,但是单独做的简单的程序来测试,BUG又不能够重现。 我继续找原因了,真心谢谢你的提醒,还亲自测试。
离线dbzhang800

只看该作者 11楼 发表于: 2014-03-28
回 wxyao 的帖子

wxyao:
出错的有下列数值,逗号分隔的前两个字段表示double转换成unsigned long的两个字节。
对于第一条:
double d;
unsigned long longArray[2] = {0, 1087995776};
memcpy(&d, longArray, sizeof(d));
.......


无法重现你的问题


  1. #include <QtCore>
  2. #include <string.h>
  3. int main()
  4. {
  5.     double d;
  6.     unsigned long longArray[2] = {0, 1087995776};
  7.     memcpy(&d, longArray, sizeof(d));
  8.     char buffer[100] = {0};
  9.     sprintf(buffer, "%.0f", d);
  10.     qDebug()<<d<<QString("%1").arg(d, 0, 'f', 0)<<buffer;
  11.     return 0;
  12. }


结果如下: 26110 "26110" 26110
离线dbzhang800

只看该作者 10楼 发表于: 2014-03-28
回 wxyao 的帖子
wxyao:但是在同一个线程、同位置、使用sprintf可以得到正确的结果,而QObject::tr("%1").arg(double,...)却不正确。 这个怎么解释呀
 (2014-03-27 17:20) 

但是你没有给出任何有效证据来证明你的观点。
离线wxyao

只看该作者 9楼 发表于: 2014-03-28
出错的有下列数值,逗号分隔的前两个字段表示double转换成unsigned long的两个字节。
对于第一条:
double d;
unsigned long longArray[2] = {0, 1087995776};
memcpy(&d, longArray, sizeof(d));

0,1087995776,'2610:' vs '26110'
0,1088532032,'3620:' vs '36210'
0,1088685632,'4100:' vs '41010'
0,1088692032,'4120:' vs '41210'
0,1089092032,'5370:' vs '53710'
0,1089165632,'5600:' vs '56010'
0,1089841248,'8870:' vs '88710'
0,1090276448,'11590:' vs '115910'
0,1090359648,'12110:' vs '121110'

离线wxyao

只看该作者 8楼 发表于: 2014-03-27
回 dbzhang800 的帖子
dbzhang800:要确认是不是bug,你只需要几行代码即可,比如下面这样
#include <QtCore>
int main()
{
....... (2014-03-27 10:24)

但是在同一个线程、同位置、使用sprintf可以得到正确的结果,而QObject::tr("%1").arg(double,...)却不正确。 这个怎么解释呀
离线wxyao

只看该作者 7楼 发表于: 2014-03-27
回 dbzhang800 的帖子
dbzhang800:要确认是不是bug,你只需要几行代码即可,比如下面这样
#include <QtCore>
int main()
{
....... (2014-03-27 10:24) 

谢谢,明白你的意思,可能是代码中多线程,或内存越界引起的,或者是Qt的arg线程安全有bug。
暂时没找到自身的原因,就怀疑是Qt的bug喽~~~ 有可能是我程序的问题,继续查找~~~
离线dbzhang800

只看该作者 6楼 发表于: 2014-03-27
要确认是不是bug,你只需要几行代码即可,比如下面这样

  1. #include <QtCore>
  2. int main()
  3. {
  4. qDebug()<<QString("...").arg(...);
  5. return 0;
  6. }


在线uidab

只看该作者 5楼 发表于: 2014-03-27
回 wxyao 的帖子
wxyao:最后一位为0是我的需求呀,之前最后一位不为0倒还没发现过错误。  例如我需要把100.001的double转换成(int)100。 (2014-03-27 09:51) 

那不清楚了,既然你有double转int的需要,可以把这部分与转换成QString分开做试试。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线wxyao

只看该作者 4楼 发表于: 2014-03-27
回 uidab 的帖子
uidab:qsTurnoverVol = tr("%1").arg(price.TurnoverVol, 0, 'f', 0);  
个人觉得最后一位的0出的错误,你改成3或其他数字试试!! (2014-03-27 09:17) 

最后一位为0是我的需求呀,之前最后一位不为0倒还没发现过错误。  例如我需要把100.001的double转换成(int)100。
离线wxyao

只看该作者 3楼 发表于: 2014-03-27
回 realfan 的帖子
realfan:我在MingW Qt5.3Beta下试了,没有问题 (2014-03-27 00:16) 

谢谢关注哦,实际上不是经常出错,而是偶尔出错,奇怪的是,总是在出现值为xxx10.0的double值会转换出错。 我正准备把出错的double强制转换成两个unsigned long打印出来看看,看看能不能还原问题。
在线uidab

只看该作者 2楼 发表于: 2014-03-27
qsTurnoverVol = tr("%1").arg(price.TurnoverVol, 0, 'f', 0);  

个人觉得最后一位的0出的错误,你改成3或其他数字试试!!
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线realfan

只看该作者 1楼 发表于: 2014-03-27
我在MingW Qt5.3Beta下试了,没有问题
快速回复
限100 字节
 
上一个 下一个