none
指针指向这句是ASSERT(nBuf >= 0);什么错误呀?如何把缓冲区设计的足够大呀? RRS feed

答案

  • 这个你只能把str1缩短了,或者自己写一个TRACE.

    这也算是一个MFC设计上不得已的BUG.本来TRACE就是用来显示很短的句子的.

    类似的MFC的BUG还有不少,比如MFC下的TOOLTIP,只支持512个字节,超了的话都不会报错,程序直接崩溃.呵呵,像这些东西用的多了就知道了,最好的办法还是明白原理,自己动手.


    0xBAADF00D
    • 已标记为答案 Nancy Shao 2010年1月25日 7:19
    2010年1月8日 16:28
    版主

全部回复

  • ASSERT函数

    Evaluates its argument.

     
    ASSERT(
          booleanExpression
    )

     

    Parameters

    booleanExpression

    Specifies an expression (including pointer values) that evaluates to nonzero or 0.

    Remarks

    If the result is 0, the macro prints a diagnostic message and aborts the program. If the condition is nonzero, it does nothing.



    说明你的nBuf < 0所以报错.可能是nBuf没有赋初值导致.


    0xBAADF00D
    2010年1月8日 3:21
    版主
  • mfc程序中的代码,我看到nbuf的值是-1,我项目程序没有nbuf。那怎么将nbuf的值设置成大于零呢?在哪里设置缓存区的大小了?谢谢
    void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
    {
    #ifdef _DEBUG // all AfxTrace output is controlled by afxTraceEnabled
     if (!afxTraceEnabled)
      return;
    #endif

     va_list args;
     va_start(args, lpszFormat);

     int nBuf;
     TCHAR szBuffer[512];

     nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args);

     // was there an error? was the expanded string too long?
     ASSERT(nBuf >= 0);

     if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
      afxDump << AfxGetApp()->m_pszExeName << ": ";
     afxDump << szBuffer;

     va_end(args);
    }

    2010年1月8日 3:31
  • was there an error? was the expanded string too long?

    这句话是代码里么的?
    vsntprintf返回-1说明你输入的字符串太长了

    0xBAADF00D
    2010年1月8日 3:38
    版主
  • 是代码里的吧,我没动过,是mfc中src 里面的dumpout.cpp中的代码。项目里指向的是TRACE("%s\n", str1);这句str1得值是<TABLE id="test_linkhori_table_3" style="LEFT:20px;WIDTH:500px;POSITION: absolute;TOP: 60px;HEIGHT:30px" border="1"
    name="test_linkhori_table_3" itemtype="test_linkhori_table" groupid="test_link_group_2" istesttable test_tab"是字符串挺长的,可是好像缩短就实现不了功能了。您说这怎么改呀?

    2010年1月8日 3:53
  • 指针指向这句ASSERT(nBuf >= 0);是什么错误呀?如何把缓冲区设计的足够大呀?谢谢!

    是因为nBuf 的值小于0了, 你要找到nBuf值小于零的原因。
    2010年1月8日 4:22
    版主
  • 你要TRACE的这个str1长度超过了AfxTrace中定义的
    TCHAR szBuffer[512];长度。


    麻烦把正确答案设为解答。
    2010年1月8日 5:09
    版主
  • 可是<TABLE id="test_linkhori_table_3" style="LEFT:20px;WIDTH:500px;POSITION: absolute;TOP: 60px;HEIGHT:30px" border="1"
    name="test_linkhori_table_3" itemtype="test_linkhori_table" groupid="test_link_group_2" istesttable test_tab"这个长度是表格的一些属性,怎么缩短呀?

    2010年1月8日 5:39
  • 现在nBuf的返回地址是0xffffffff,szBuffer[512]的值是0x6b'k',但是错误还是照常存在,但是我看也没有关于str1的长度定义。请帮忙看看吧,谢谢!
    相关代码是:
    if (propertyName == property)
     {
      // 按纽名称
      childElem->get_innerHTML(&p);
      str = p;
      i = str.Find("onmouseout");
      tempStr = str.Mid(i);
      int j;
      j = i;
      i = tempStr.Find("this.value");
      tempStr = tempStr.Mid(i);
      j += i;
      str = str.Left(j);
      str += "this.value='";
      str += value;

      i = tempStr.Find("'");
      tempStr = tempStr.Mid(i+1);
      i = tempStr.Find("'");
      tempStr = tempStr.Mid(i);

      CString str1;
      i = tempStr.Find("value");
      str1 = tempStr.Left(i);
      str1 += "value=";
      str1 += value;

      i = tempStr.Find("name");
            tempStr = tempStr.Mid(i);
      str1 += "  ";
      str1 += tempStr;

      str += str1;
      p = str;
      childElem->put_innerHTML(p);

     }

    2010年1月8日 8:00
  • 哪行出错了?
    CString::Find函数没有判断返回值,如果没有找到返回-1,会导致CString::Mid函数错误。


    麻烦把正确答案设为解答。
    2010年1月8日 9:24
    版主
  • 谢谢您!这里是没有错误,错误发生在 TRACE("%s\n", str1),str1的长度超过了TCHAR szBuffer[512];长度就会导致指向这句ASSERT(nBuf >= 0);现在str1的长度程序里没有找到。nBuf的值返回一个大于零的值才对吗?

    2010年1月8日 9:46
  • 看一下调用堆栈,是哪一句导致调TRACE的。


    麻烦把正确答案设为解答。
    2010年1月8日 9:59
    版主
  • 这个你只能把str1缩短了,或者自己写一个TRACE.

    这也算是一个MFC设计上不得已的BUG.本来TRACE就是用来显示很短的句子的.

    类似的MFC的BUG还有不少,比如MFC下的TOOLTIP,只支持512个字节,超了的话都不会报错,程序直接崩溃.呵呵,像这些东西用的多了就知道了,最好的办法还是明白原理,自己动手.


    0xBAADF00D
    • 已标记为答案 Nancy Shao 2010年1月25日 7:19
    2010年1月8日 16:28
    版主
  • 哦,好的,谢谢您们了!
    2010年1月9日 2:29