关于 CArrayFixFlat 与 RArray 与 CArrayPtrFlat 的测试

RArray 与 CArrayFixFlat 保存的是对话的副本,如果添加栈对像到 这个类的里面,当出了栈对像的作用域后,还是可以使用

RArray 与 CArrayFixFlat 中保存的值的,因为RArray 与 CArrayFixFlat 保存的是栈对像的副本

而 CArrayPtrFlat 则保存的是对像的地址,如果用临时变量(保存到栈的变量),出了变量的作用域后,则再次调用

CArrayPtrFlat 后,出现乱码。

如果用 RArray 与 CArrayFixFlat 保存 TDes 时,要写明长度,不能直接用 RArray<TDesC> 这种定义,否则在获取 RArray 的数据时

出现乱码,同样适用于 RArrayFixFlat

对于这个,刚开始一直以为是代码哪里有问题,后来找到别人写的文章,才发现定义不一样,改正后就没有问题了

代码如下:

LOCAL_D CConsoleBase* console;  // write all messages to this


//  Local Functions

typedef TBuf<4> tb;
class CTest
 {
public:
 CTest()
  {
   iList = new(ELeave)CArrayFixFlat< TBuf<4> >(3);
  }
 // 注意这里定义是要加一个空格,否则编译不了,
 // 或上面定义的 tb类型
 CArrayFixFlat< TBuf<4> >*  iList;
 //RArray<TBuf<4> > iList;
 void add(TDesC& ades)
  {
   
   iList->AppendL(ades);
   //iList.Append(ades);
   console->Printf(ades);
  }
 };
LOCAL_C  void add(CTest* ac)
 {
  _LIT(KT,"aad1");
  TBuf<4> buf1(KT);
  _LIT(KT1,"bbd2");
  TBuf<4> buf2(KT1);
  _LIT(KT2,"ccd3");
  TBuf<4> buf3(KT2);
  ac->add(buf1);
  ac->add(buf2);
  ac->add(buf3);

 }

LOCAL_C void MainL(const TDesC& aArgs)
    {
    //
    // add your program code here, example code below
    //
    //console->Write(_L("Hello, world!\n"));
    //console->Printf(_L("Command line args: \"%S\"\n"), &aArgs);
    CTest c;
    add(&c);
    /*_LIT(KT,"aad");
 TBuf<4> buf1(KT);
 _LIT(KT1,"bbd");
 TBuf<4> buf2(KT1);
 _LIT(KT2,"ccd");
 TBuf<4> buf3(KT2);
 c.add(buf1);
 c.add(buf2);
 c.add(buf3);*/
    //for(TInt i=0;i<c.iList.Count()-1;i++)
    for(TInt i=0;i<c.iList->Count()-1;i++)
  {
  TPtrC buf=(c.iList->At(i));
  //TBuf<4> buf=c.iList[i];
  //TPtrC p = &(c.iList->At(i));
  console->Write(buf);
  //console->Write(c.iList->At(i));
  }
    }

LOCAL_C void DoStartL()
    {
    // Create active scheduler (to run active objects)
    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
    CleanupStack::PushL(scheduler);
    CActiveScheduler::Install(scheduler);

    // Call main function with command line
    TBuf<256> cmdLine;
    RProcess().CommandLine(cmdLine);
    MainL(cmdLine);

    // Delete active scheduler
    CleanupStack::PopAndDestroy(scheduler);
    }

原文地址:https://www.cnblogs.com/zziss/p/1762147.html