我爱builder

C++Builder 程序员博客

#ifndef av_const
#if defined(__GNUC__) && (__GNUC__ > 2 &brvbar &brvbar __GNUC__ == 2 && __GNUC_MINOR__ > 5)
#    define av_const __attribute__((const))
#else
#    define av_const
#endif
#endif

下面这2行到底定义了个什么东西?
#    define av_const __attribute__((const))
#    define av_const

还有:
typedef struct AVRational{
    int num; /// < numerator
    int den; /// < denominator
} AVRational;

AVRational av_mul_q(AVRational b, AVRational c) av_const;
AVRational av_div_q(AVRational b, AVRational c) av_const;
上面这2个函数定义的后面的av_const(就是上面定义的)表示什么?这个函数是返回了这个结构还是这个结构的指针?

谢谢!

__attribute__ const
  该属性只能用于带有数值类型参数的函数上。当重复调用带有数值参数的函数时,由于返回值是相同的,所以此时编译器能够进行优化处理,除第一次需要运算外,其他只需要返回第一次的结果就能够了,进而能够提高效率。该属性主要适用于没有静态状态(static state)和副作用的一些函数,并且返回值仅仅依赖输入的参数。

该回复于2008-08-27 09:06:08被版主删除

下面的typedef是定义了1个结构体

  • Filed under: C++ Builder
  • struct CStringData
    {
    long nRefs;    // reference count
    int nDataLength;
    int nAllocLength;
    // TCHAR data[nAllocLength]

    TCHAR* data()
    { return (TCHAR*)(this + 1); }
    };

    // Globals

    int rgInitData[] = { -1, 0, 0, 0 };
    CStringData* _atltmpDataNil = (CStringData*)&rgInitData;
    LPCTSTR _atltmpPchNil = (LPCTSTR)(((BYTE*)&rgInitData) + sizeof(CStringData));

    ////////////////////////////////////////////////////////////////////////////////////
    谁来解释下 最后俩行代码的意思。
    &rgInitData   
    (LPCTSTR)(((BYTE*)&rgInitData) + sizeof(CStringData))
    这些 指针 是怎么 变化的???
    谢谢

    &rgInitData //取rgInitData 的地址

    (LPCTSTR)(((BYTE*)&rgInitData) + sizeof(CStringData))
    这个得分几步来讲
    1、&rgInitData//取得一个地址,也就是指针
    2、(BYTE*)&rgInitData//把取得的指针强制转换为BYTE类型的指针
    3、sizeof(CStringData)//计算CStringData类型变量的所占的内存长度
    4、((BYTE*)&rgInitData)+ sizeof(CStringData))//把步骤2强制转换得来的指针加上步骤3算出来的增量
    5、由步骤4算得出一个新的指针,它指向了距离rgInitData后面sizeof(CStringData)的地方,现在把这个指针强制转换为LPCTSTR类型

    有点难度哦

  • Filed under: C++ Builder
  • CoInitialize(NULL);
        Variant ca=Variant::CreateObject("ADOX.Catalog");
          AnsiString temp="Provider=Microsoft Jet 4.0 OLE DB Provider;Data Source="+要生成的数据库路径+";Jet OLEDB:Database Password=123";
          ca.OleProcedure("Create",temp.c_str());
          ca.Clear();
          //刚才创建的数据库文件
          AnsiString  conn;
          ADOConnection1->Close();
          conn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
          conn=conn+DbName;
          conn=conn+";Mode=Share Deny Read &brvbarShare Deny Write;Persist Security Info=True;Jet OLEDB:Database Password=123";
          ADOConnection1->ConnectionString=conn;
          ADOConnection1->Open();
          DataModule1->ADOCommand1->CommandText="Create Table 表名(字段名 类型,字段名 类型)";
          DataModule1->ADOCommand1->Execute();
          CoUninitialize();

    CoInitialize(NULL);//用来初始化ADO环境
    Variant ca=Variant::CreateObject("ADOX.Catalog"); //创建一个ADO对象
    ca.OleProcedure("Create",temp.c_str());
    CoUninitialize();//退出刚刚创建的ADO环境
    ca.Clear(); //释放对象

    CoInitialize(NULL); //調用前初始化
    CoUninitialize();  //不用了通知系統析構。
    這是調用COM類型庫需要做的動作,在DLL中使用時需要。在主程序中,因VCL會自行調用,所以不需要重復調用了。
    Variant ca=Variant::CreateObject  //建立COM物件
    ca.OleProcedure                  //運行指令
    ca.Clear();                      //釋放
    //這是執行ole操作,也就是傳遞指令到相應的COM物件上去,讓別人幫你做事。
    ca.Clear();是完事了,告訴別人沒事了,不用傻傻地等指令了,系統可以清除這對象了。

  • Filed under: C++ Builder
  • int   main(int   argc,   char*   argv[])
    {
      const   int   num   =   10;

      int   interval;

      int   a[num];

      for(int   i   =   0;i   <   num;   i++)
      a[i]   =   i   +   1;

    cout < < "please   input   the   interval: ";
    cin> > interval;
    cin.get();

    for(int   i   =   0;i <num;i++)
      {
          cout < <a[i] < < ", ";

      }
        cout < <endl;
     
    int   k   =   1;

      int   m   =   -1;

      while(1)     //??????
        {
            for(int   j   =   0;   j   <   interval;)
              {
                  m   =   (m   +   1)%num;   //?????
                  if(a[m]!=0)       //??????
                    j++;
              }

              if(k   ==   num)   break;

              cout < <a[m] < < ", ";
              a[m]=   0;
              k++;
        }

        cout < < "\nNo. " < <a[m] < < "   boy 's   win\n ";
      cin.get();

    请解释下后面打问号的代码  

    最难让我理解的是   while(1)   这是怎么回事呢?   请高手解答,谢谢!

    while(1)
    ========
    不达目的不罢休

    while   (1)   这种写法   其实是利用C/C++   语言   的特性,在逻辑表达式里所有的非0   值都被当成true.     这里的意思就是while   条件永远都成立,在if   (k==num)   break;   退出这个while   循环.

    建议仔细看看C   语言

    谢谢大家的回复,我已经明白了

    豪杰

  • Filed under: C++ Builder
  • TForm2 *fm2=new TForm2(this);
    fm2->ShowModal();
    delete fm2;

    TForm2 *fm2=new TForm2(this); fm2是个指针   这句打开了一个新的TFORM2
    fm2->ShowModal();        使TFORM2窗口设为当前活动窗口
    delete fm2;         删除FM2指针

    TForm2 *fm2=new TForm2(this); //建立新Form 
    fm2->ShowModal();             //以模态方式显示窗口 (就是你不关掉fm2就不能切换到程序的其他窗口)
    delete fm2;                   //删除窗口指针(删除窗口指针,窗体就被你销毁了) 

    呀!是你啊.分数又被你骗去了.

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档