【问题标题】:Precision Related Error in C++C++ 中与精度相关的错误
【发布时间】:2015-10-31 08:33:57
【问题描述】:

在构建软件时出现错误:

../src/internet/model/nampt-socket.cc: In member function ‘ns3::Ptr<ns3::NaMPTSubflow> ns3::NaMPTSocket::SwitchToMultipathMode()’:
../src/internet/model/nampt-socket.cc:881:14: error: cast from ‘ns3::NaMPTSocket*’ to ‘uint32_t {aka unsigned int}’ loses precision [-fpermissive]
    (uint32_t)this,
              ^
Waf: Leaving directory `/home/vikas/ns-allinone-3.14.1/ns-3.14.1/build'
Build failed
 -> task in 'ns3-internet' failed (exit status 1): 
    {task 140476688662992: cxx nampt-socket.cc -> nampt-socket.cc.1.o}
['/usr/bin/g++', '-O0', '-ggdb', '-g3', '-Wall', '-Werror', '-Wno-error=deprecated-declarations', '-fstrict-aliasing', '-Wstrict-aliasing', '-fPIC', '-pthread', '-Ibuild', '-I.', '-DNS3_ASSERT_ENABLE', '-DNS3_LOG_ENABLE', '-DSQLITE3=1', '-DHAVE_IF_TUN_H=1', '-DENABLE_GSL', '../src/internet/model/nampt-socket.cc', '-c', '-o', 'src/internet/model/nampt-socket.cc.1.o']
Traceback (most recent call last):
  File "./build.py", line 214, in <module>
    sys.exit(main(sys.argv))
  File "./build.py", line 205, in main
    build_ns3(config, build_examples, build_tests, args, build_options)
  File "./build.py", line 98, in build_ns3
    run_command([sys.executable, "waf", "build"] + build_options)
  File "/home/vikas/ns-allinone-3.14.1/util.py", line 24, in run_command
    raise CommandError("Command %r exited with code %i" % (argv, retval))
util.CommandError: Command ['/usr/bin/python', 'waf', 'build'] exited with code 1

错误是:

cast from ‘ns3::NaMPTSocket*’ to ‘uint32_t {aka unsigned int}’ loses precision [-fpermissive]

我搜索了错误,但是 在我的情况下无法使用 uintptr_t。有没有其他可能的解决方案?

错误来自的代码是:

Ptr<NaMPTSubflow> 
NaMPTSocket::SwitchToMultipathMode(void)
{
  NS_ASSERT(m_firstSocket != 0);
  NS_ASSERT(m_firstSocket->m_state == SYN_SENT || m_firstSocket->m_state == SYN_RCVD);
  NS_ASSERT(m_firstSocket->m_shellSocket == this);

  // change to NaMPTCC
  // the original socket will be discarded from m_tcp->m_sockets
  m_socketTypeId = NaMPTCC::GetTypeId();
  m_firstSocket = NaMPTSocket::ConvertCongestionControl(m_firstSocket);

  // subflow
  Ptr<NaMPTSubflow> sf = SetupSubflow(m_firstSocket, true);
  sf->m_bBypassSending = true;
  NS_ASSERT(sf->m_baseSocket == m_firstSocket);

  // session name: time-socket-src-des
  if (m_timeTag == 0)
    m_timeTag = Simulator::Now().GetSeconds();
  char buf[128];
  snprintf(buf, 128, "%.6f-%08x-%u.%u.%u.%u->%u.%u.%u.%u", 
            m_timeTag, 
            (uint32_t)this,
            (sf->m_localAddress.Get() >> 24)&0x000000FF,
            (sf->m_localAddress.Get() >> 16)&0x000000FF,
            (sf->m_localAddress.Get() >> 8)&0x000000FF,
            (sf->m_localAddress.Get() )&0x000000FF,
            (sf->m_peerAddress.Get() >> 24)&0x000000FF,
            (sf->m_peerAddress.Get() >> 16)&0x000000FF,
            (sf->m_peerAddress.Get() >> 8)&0x000000FF,
            (sf->m_peerAddress.Get() )&0x000000FF );
  m_sessionName = buf;

  // init connection
  m_localPort = m_firstSocket->m_endPoint->GetLocalPort();
  m_peerPort = m_firstSocket->m_endPoint->GetPeerPort();
  m_nextTx = m_firstSocket->m_nextTxSequence;
  m_nextTx ++; // syn consumes one byte
  m_inputQueue.SetHeadSequence(m_nextTx);

  // next used addr
  AddressSet_t::const_iterator it = m_addresses.find(sf->m_localAddress.Get());
  it++;
  if (it == m_addresses.end() )
    it = m_addresses.begin();
  m_nextAddr = it->first;

  // m_outputQueue is initialized after this function returns.

  m_firstSocket = 0; // this is important...
  return sf;
}

【问题讨论】:

  • 您介意分享导致问题的代码吗?
  • @wheee 真的吗?它是导致错误的一行。该行是 (uint32_t)this,
  • @wheee 抱歉,请查看已编辑的问题。谢谢。
  • 将其转换为 intptr_t 类型
  • @Fernando " 为什么投反对票?" 一大堆原因,首先是调试你的代码并询问观察到的异常情况。

标签: c++ compiler-errors type-conversion


【解决方案1】:

你怎么有uint32_t 但没有uintptr_t?它们应该在同一个标​​头中定义。

但假设你真的没有,那就自己创建吧。

typedef uint64_t uintptr_t;

【讨论】:

  • 你可以。但是uintptr_t 更有表现力。
  • 不好的建议。指针大小根据平台而变化。
  • 对,所以这个定义应该放在定义平台特定类型的任何地方。但无论如何,我认为@Moby Disk 的答案更好。
  • @AShelly 我试过你建议的答案现在我得到一个错误:rc/network/utils/ipv6-address.cc: In function 'uint32_t ns3::lookuphash(unsigned char*, uint32_t, uint32_t )': ../src/network/utils/ipv6-address.cc:63:26: 错误:typedef 'ub1' 本地定义但未使用 [-Werror=unused-local-typedefs] typedef unsigned char ub1; /* 无符号的 1 字节数量 */
  • @AShelly 我还收到消息 cc1plus: all warnings being treated as errors 而且我无法在构建文件中处理任何 -Werror 标志(我搜索了消息并得到答案,必须有一个-错误标志)。
【解决方案2】:

我相信correct way to printf a pointer is to use %p。所以你想把代码改成这样:

snprintf(buf, 128, "%.6f-%p-%u.%u.%u.%u->%u.%u.%u.%u", 
            m_timeTag, 
            (void *)this,
            (sf->m_localAddress.Get() >> 24)&0x000000FF,
            (sf->m_localAddress.Get() >> 16)&0x000000FF,
            (sf->m_localAddress.Get() >> 8)&0x000000FF,
            (sf->m_localAddress.Get() )&0x000000FF,
            (sf->m_peerAddress.Get() >> 24)&0x000000FF,
            (sf->m_peerAddress.Get() >> 16)&0x000000FF,
            (sf->m_peerAddress.Get() >> 8)&0x000000FF,
            (sf->m_peerAddress.Get() )&0x000000FF );

这避免了转换为任何类型的整数的需要。 %p 也以十六进制格式化,同时避免在 printf 语句中指定字段大小。编译为 32 位或 64 位时会自动调整大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2019-03-13
    • 2011-03-13
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    相关资源
    最近更新 更多