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);
}