在vb中,我们可以先定义一个变体数组,然后可以重定义使用,但是在vc中怎么实现此功能呢?
dim arr()
intNumber= Record.RecordCount();
redim arr(intNumber)在vc中,有类似于redim 的方法么?或者说我们一般怎么解决这个问题的呢?
我刚刚接触vc,请各位指点

解决方案 »

  1.   

    请使用VC的数组容器类:
    CByteArray      BYTE型数组
    CWordArray      WORD型数组
    CDWordArray     DWORD型数组
    CUIntArray      unsigned int型数组
    CStringArray    CString型数组
    CPtrArray       void *型数组
    CObArray        CObject *型数组
    正如楼上所说数组空间分配是在编译时进行的,不能在运行时改变。要想改变就要使用动态分配内存。以上各类的内部正是这样实现的。它们在初始化的时候被分配一定量的内存,随着你不断扩充,它们会动态扩充内存(其实是重新分配一块更大的内存,然后把以前的数据复制进去)。
    以上各类是特定型别的。如果你想为任意一种类的对象创建一个这样的管理者,请使用数组模板:
    CArray<class,class&> object;
    class是你要管理的对象的类名。object是你要定义的数组对象.
      

  2.   

    大伙说的都对,不过离我的要求还差一点,
    CArray<CStringArray *,CStringArray *> ArryFunc;
    intNumber=rs.recordcount;
    CStringArray arryFunc[intNumber]; //出错
    for(int i=0;i<intNumber;i++)
    {
        intNumber1 = rs.recordcount;
        for(int j=0;j<intNumber1;j++)
           arryFunc[j].Add("asdf");
        ArryFunc.Add(&arryFunc[j]);
    }大伙仔细的看一下这段代码,帮我分析一下吧,,
      

  3.   

    对不起,上边这段代码有点问题,
    改成如下,
    CArray<CStringArray *,CStringArray *> ArryFunc;
    intNumber=rs.recordcount;
    CStringArray arryFunc[intNumber]; //出错
    for(int i=0;i<intNumber;i++)
    {
        intNumber1 = rs.recordcount;
        for(int j=0;j<intNumber1;j++)
           arryFunc[i].Add("asdf");
        ArryFunc.Add(&arryFunc[i]);
    }大伙仔细的看一下这段代码,帮我分析一下吧,,
      

  4.   

    CStringArray arryFunc[intNumber]; //出错
    出错是当然的,因为intNumber是变量,不能用变量作声明的数组的维数。
      

  5.   

    从VB到VC你得忘掉很多的东西!
      

  6.   

    编译器,
     你好, 我知道这行出错的,但是我现在找不到更好的方法 据个小例子,说明一下我要实现的功能,
     比如说,数据库有2个表,一个为公司表,FirmId
                          另一个为部门表,FirmId,DeptId
     因为有多少个公司是不定的,每个公司对应的部门数量也是不定的,这些数值都需要从数据库中查询出来。现在我是想把公司及公司对应的部门查询出来保存在数组里边(用CArry).CArray<CStringArray *,CStringArray *> ArryFirm;  //保存arryDept
    intNumber=rsFirm.recordcount;      //取得公司的个数
    CStringArray arryDept[intNumber]; //出错, 用来保存公司id及部门信息
    for(int i=0;i<intNumber;i++)
    {   
        arryDept.Add("FirmId的值");//第一个元素的值为公司id,其余元素的值为对应的部门id
        intNumber1 = rsDept.recordcount;//取得某个公司对应的部门的数量
        for(int j=0;j<intNumber1;j++)
           arryDept[i].Add("部门信息");    ArryFirm.Add(&arryDept[i]); //把某个公司的id及该公司的所有部门id保存起来
    }
    现在您明白了我要做什么了么?
      

  7.   

    老兄,CStringArray本来就是个数组了,不用写成arryDept[intNumber];
      

  8.   

    CArray<CStringArray *,CStringArray *> array;
    CStringArray arraydept;
    for(int i=0;i<10;i++){
    for(int j=0;j<10;j++)
    arraydept.Add(_T("abcd"));
    array.Add(&arraydept);
    }
    CString(array.GetAt(0)->GetAt(1));
    AfxMessageBox(CString(((CStringArray *)array.GetAt(0))->GetAt(1)));
    我调试过了这段代码没错,你借鉴一下吧;注意include <afxtempl.h>
      

  9.   

    在循环里NEW一个空间,再ADD到数组里!
      

  10.   

    唐旭兄,
       你的这段代码产生的 arraydept数组内容没有释放,不是越来越多么?也就是array对应的每一个元素都会包含原来的数据看看这样,可不可以?
      CArray<CStringArray *,CStringArray *> array;//公共的数组
    CStringArray *pDept;
    for(int i=0;i<10;i++){
                      pDept = new CStringArray;
    for(int j=0;j<10;j++)
    pDept->Add(_T("abcd"));
    array.Add(pDept);
    } 这样就有一个内存释放的问题,看看这样释放可不可以?
             //当我们对array这个数组使用完后(array可能要在别的函数里边使用,因此array应该为公共的数组),         for (int j=0 ; j< array.GetSize();j++)
             {
                  CStringArray * pArray = array.GetAt(j);
                  delete(pArray);
              }         
      

  11.   

    不用释放,因为对象是在栈上建立的,两个数组都是对象。他们会自动析构,至于指针,容器类内部已经帮你进行管理了,否则也不会叫safearray了
      

  12.   

    搞不懂,C下面不用指针,一定要套用Basic的数组概念,不是自找麻烦吗?