伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一个不错的Leave示例

Posted on 2007-02-09 17:55  伯乐共勉  阅读(230)  评论(0编辑  收藏  举报
#include <e32base.h>
#include <e32cons.h>
#include <e32std.h>

// 定义本地数据
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,"\nLeave 测试\n");
    //存放一组二维值,分别表示长和宽
    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 \n"),i++,key);

        // 按 T 键 
        if (key==116)
        {
            
            console->Write(_L("[T]请输入A和B的值:\na="));
            //从键盘输入
            TInt a=console->Getch(); 
            //把输入码转为0-9的数字
            a=a-48;
            console->Printf(_L("%d"),a);
            
            console->Write(_L("\nb="));

            TInt b=console->Getch();
            b=b-48;
            console->Printf(_L("%d\n"),b);

            //使用 Trap 宏设置 code point,
            //函数在Trap Harness的保护下运行
            TRAP(err,Ex_1_L(a,b));
            //输出错误码
            console->Printf(_L("err=%d\n"),err);
            //错误处理
            if(err==2)
            {
                console->Write(_L("错误:a不能大于b!\n"));
                err=KErrNone;
            }

        }


        // 按 C 键 清楚屏幕
        if (key==99)
        {
            console->ClearScreen();
        }

        // 按 S 键 
        if (key==115)
        {
        
            console->Write(_L("[S]请输入A和B的值:\na="));
            //从键盘输入
            TInt a=console->Getch(); 
            //把输入码转为0-9的数字
            a=a-48;
            console->Printf(_L("%d"),a);

            console->Write(_L("\nb="));

            TInt b=console->Getch();
            b=b-48;
            console->Printf(_L("%d\n"),b);

            //使用 Trap 宏设置 code point,
            //函数在Trap Harness的保护下运行
            TRAP(err,Ex_2_L(a,b));
            //输出错误码
            console->Printf(_L("err=%d\n"),err);
            //错误处理
            if(err<0)
            {
                console->Write(_L("错误:值不可以小于零!\n"));
                err=KErrNone;
            }
            else
            {
                console->Write(_L("没有Leave发生!\n"));
            }
        }
        // 按 D 键 
        if (key==100)
        {
        
            CConsoleBase* cnsx=console;
            cnsx->Write(_L("我是cnsx指针\n"));

            console->Write(_L("是否要取消cnsx 指针?y/n \n"));
            TInt ch=console->Getch();
            if(ch==121 || ch==69)
            {
                cnsx=NULL;
            }
            else
            {
                cnsx->Write(_L("我还在那!\n"));
            }
            //设置Code Point
            TRAP(err, Ex_3_L(cnsx));

            console->Printf(_L("err=%d\n"),err);

            if(err<0)
            {
                console->Write(_L("错误:cnsx指针已经被取消!\n"));
            }
        } 
    }

return 0; 
}

TInt Ex_1_L(TInt aNuma,TInt aNumb)
{

    console->Printf(_L("Ex_1_L:a=%d,b=%d\n"),aNuma,aNumb);

    //如果 aNuma 的值大于aNumb 的值则leave
    if(aNuma>aNumb)
    {
        console->Printf(_L("%d>%d ,User Leave!\n"),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\n"),aNuma,aNumb);
    TInt sub;
    sub=aNumb-aNuma;
    if(sub<0)
    {
        console->Printf(_L("%d-%d=%d,%d<0,User Leave!\n"),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;
}


至于如何制作成VC的项目并调试,请参考一下HELLOWORLD.MMP的做法,然后再用bldmake 此命令制作成VC6项目文件。