// 定义本地数据
LOCAL_D CConsoleBase* console;
LOCAL_D TInt err;
//定义本地代码
LOCAL_C TInt Ex_1_L(TInt,TInt);
LOCAL_C TInt Ex_2_L(TInt,TInt);
LOCAL_C TInt Ex_3_L(CConsoleBase*);
//全局函数,被 E32 调用的主函数,
GLDEF_C TInt E32Main()
{
// 定义一个 Descriptor,作为Console的标头显示
_LIT(TITLE,"
Leave 测试
");
//存放一组二维值,分别表示长和宽
TSize Ts=TSize();
//设置这组值
Ts.SetSize(-1,-1);
//在 e32base.h 中定义了Console 类 ,NewL() 这个类的静态方法。
console=Console::NewL(TITLE,Ts);
TInt i=0;
TKeyCode key;
while(i<1000)
{
//断言处理:按 Esc 键 终止线程并退出
__ASSERT_ALWAYS(key!=27,User::Panic(_L("End Thread"),key));
key=console->Getch();
console->Printf(_L("step[%d]:%c
"),i++,key);
// 按 T 键
if (key==116)
{
console->Write(_L("[T]请输入A和B的值:
a="));
//从键盘输入
TInt a=console->Getch();
//把输入码转为0-9的数字
a=a-48;
console->Printf(_L("%d"),a);
console->Write(_L("
b="));
TInt b=console->Getch();
b=b-48;
console->Printf(_L("%d
"),b);
//使用 Trap 宏设置 code point,
//函数在Trap Harness的保护下运行
TRAP(err,Ex_1_L(a,b));
//输出错误码
console->Printf(_L("err=%d
"),err);
//错误处理
if(err==2)
{
console->Write(_L("错误:a不能大于b!
"));
err=KErrNone;
}
}
// 按 C 键 清楚屏幕
if (key==99)
{
console->ClearScreen();
}
// 按 S 键
if (key==115)
{
console->Write(_L("[S]请输入A和B的值:
a="));
//从键盘输入
TInt a=console->Getch();
//把输入码转为0-9的数字
a=a-48;
console->Printf(_L("%d"),a);
console->Write(_L("
b="));
TInt b=console->Getch();
b=b-48;
console->Printf(_L("%d
"),b);
//使用 Trap 宏设置 code point,
//函数在Trap Harness的保护下运行
TRAP(err,Ex_2_L(a,b));
//输出错误码
console->Printf(_L("err=%d
"),err);
//错误处理
if(err<0)
{
console->Write(_L("错误:值不可以小于零!
"));
err=KErrNone;
}
else
{
console->Write(_L("没有Leave发生!
"));
}
}
// 按 D 键
if (key==100)
{
CConsoleBase* cnsx=console;
cnsx->Write(_L("我是cnsx指针
"));
console->Write(_L("是否要取消cnsx 指针?y/n
"));
TInt ch=console->Getch();
if(ch==121 || ch==69)
{
cnsx=NULL;
}
else
{
cnsx->Write(_L("我还在那!
"));
}
//设置Code Point
TRAP(err, Ex_3_L(cnsx));
console->Printf(_L("err=%d
"),err);
if(err<0)
{
console->Write(_L("错误:cnsx指针已经被取消!
"));
}
}
}
return 0;
}
TInt Ex_1_L(TInt aNuma,TInt aNumb)
{
console->Printf(_L("Ex_1_L:a=%d,b=%d
"),aNuma,aNumb);
//如果 aNuma 的值大于aNumb 的值则leave
if(aNuma>aNumb)
{
console->Printf(_L("%d>%d ,User Leave!
"),aNuma,aNumb);
User::Leave(2);
}
return 0;
}
TInt Ex_2_L(TInt aNuma,TInt aNumb)
{
console->Printf(_L("Ex_2_L:a=%d,b=%d
"),aNuma,aNumb);
TInt sub;
sub=aNumb-aNuma;
if(sub<0)
{
console->Printf(_L("%d-%d=%d,%d<0,User Leave!
"),aNumb,aNuma,sub,sub);
}
//当sub值小于 0 时 leave
User::LeaveIfError(sub);
return 0;
}
TInt Ex_3_L(CConsoleBase* cnx)
{
//当 cnx等于 NULL 时 leave
User::LeaveIfNull(cnx);
return 0;
}