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