查看完整版本: 写出来的程序会Fatal Exception希望DX指点!

Wind-Bell 2006-7-13 22:18

写出来的程序会Fatal Exception希望DX指点!

#include <PalmOS.h>
#include "TicTacToe.h"

#define MainForm        1000
#define MainGadget        1000

struct boxNumber
{
        Int16 ordinal;
        Int16 x;
        Int16 y;
};
static Boolean appHandleEvent (EventPtr pEvent);
static void    mainFormInit (FormPtr pForm);
static Boolean mainFormEventHandler (EventPtr pEvent);
static Boolean doMainMenu (FormPtr pForm, UInt16 command);
static void startApp() {return;}
static void stopApp()  {return;}
static void* getobjectPtr(FormPtr pForm, Int16 resourceNo);
static void TicTacToeDraw(FormPtr pForm,UInt16 gadgetID);
static void TicTacToeTap(FormPtr pForm,UInt16 gadgetID,EventPtr pEvent);
static struct boxNumber getBoxWithPen(RectangleType bounds,Int16 boxWidth,Int16 x,Int16 y);
static void getBoundsOfBox(Int16 boxWidth,struct boxNumber boxN , RectangleType *bounds , RectangleType *box);
   
    static Boolean
mainFormEventHandler(EventPtr pEvent)
{
    UInt8*  dataP;
    Boolean handled = false;
    FormPtr pForm   = FrmGetActiveForm();
    UInt16 gadgetIndex = FrmGetobjectIndex(pForm,MainGadget);
        RectangleType bounds;
    switch (pEvent->eType)
    {
    case frmOpenEvent:   
        FrmDrawForm(pForm);
        mainFormInit(pForm);
       TicTacToeDraw(pForm,MainGadget);
       handled = true;
        break;
        
        case frmCloseEvent:
          dataP = FrmGetGadgetData(pForm, FrmGetobjectIndex(pForm, MainGadget));
        if (dataP!=0)
                {MemPtrFree(dataP); }
        break;
       
        case penDownEvent:
        FrmGetobjectBounds(pForm,gadgetIndex,&bounds);
        if( RctPtInRectangle(pEvent->screenX,pEvent->screenY,&bounds) )
        {
                TicTacToeTap(pForm,MainGadget,pEvent);
                handled = true;
        }
        break;

    default:
        break;
    }
    return handled;
}


static void mainFormInit (FormPtr pForm)
{
        void *dataP;
        void* temp;
        dataP = MemPtrNew(9*sizeof(UInt8)) ;
        temp = dataP;
        if(dataP)
        {
                MemSet(dataP,9*sizeof(UInt8),1);
                FrmSetGadgetData(pForm,FrmGetobjectIndex(pForm,MainGadget),dataP);
        }
}

void*        getobjectPtr (FormPtr pForm, Int16 resourceNo)
{
    UInt16 objIndex=FrmGetobjectIndex(pForm,resourceNo);
    return FrmGetobjectPtr(pForm,objIndex);
}

static void TicTacToeDraw(FormPtr pForm,UInt16 gadgetID)
{
        RectangleType bounds;
        UInt16 gadgetIndex = FrmGetobjectIndex(pForm,gadgetID);
        UInt8* dataP = FrmGetGadgetData(pForm,gadgetIndex);
        UInt8 i,Xadd,Yadd,temp;
//        WinDrawChars("TicTacToeDraw Init...",StrLen("TicTacToeDraw Init..."),20,20);
        if(dataP)
        {
                FrmGetobjectBounds(pForm,gadgetIndex,&bounds);
                WinEraseRectangle(&bounds,0);
                WinDrawRectangleFrame(rectangleFrame,&bounds);
                WinDrawLine(bounds.topLeft.x,bounds.topLeft.y+30,
                                                                 bounds.topLeft.x+91,bounds.topLeft.y+30);
                WinDrawLine(bounds.topLeft.x,bounds.topLeft.y+61,
                                                                 bounds.topLeft.x+91,bounds.topLeft.y+61);
                WinDrawLine(bounds.topLeft.x+30,bounds.topLeft.y,
                                                                 bounds.topLeft.x+30,bounds.topLeft.y+91);
                WinDrawLine(bounds.topLeft.x+61,bounds.topLeft.y,
                                                                 bounds.topLeft.x+61,bounds.topLeft.y+91);
//                WinDrawChars("DrawFrame OK",StrLen("DrawFrame OK"),20,20);

                Xadd = 0 ;
                Yadd = 0 ;
                for(i=0;i<9;i++)
                {
                         temp =*(dataP+i*sizeof(UInt8));
                         switch(temp)
                        {
                        case 0:
                                WinDrawChars("?",1,bounds.topLeft.x+12+Xadd*31,bounds.topLeft.y+10+Yadd*31);
                        break;
               
                        case 1:
                                WinDrawChars("X",1,bounds.topLeft.x+12+Xadd*31,bounds.topLeft.y+10+Yadd*31);
                        break;
               
                        case 2:
                                WinDrawChars("O",1,bounds.topLeft.x+12+Xadd*31,bounds.topLeft.y+10+Yadd*31);                        break;
                        break;
               
                        default:
                        break;
                        }
                        if(++Xadd > 2)
                        {
                        Xadd = 0;
                        Yadd++;
                        }
                }
        }
        WinDrawChars("TTTDraw OK",StrLen("TTTDraw OK"),20,20);

}

static        void TicTacToeTap(FormPtr pForm,UInt16 gadgetID,EventPtr pEvent)
{
        UInt16 gadgetIndex = FrmGetobjectIndex(pForm,gadgetID);
         UInt8* dataP=FrmGetGadgetData(pForm,gadgetIndex);
         UInt8* dataPB;
        if(dataP!=0)
        {
                RectangleType bou

Wind-Bell 2006-7-13 22:19

里面AppHandleEvent等等全部是样板,就不发了……超长了

ecool 2006-7-14 18:36

Crash一般都是由于指针指向错误引起的,检查检查里面用到的指针吧。

Greenland 2006-8-19 21:54

用CodeWarrior里面的debug,步步为营,看到底是在哪个地方出了错误。

yaojin_82 2006-8-23 16:31

我是菜鸟,也遇到类似问题。
问一下,这里
UInt8* dataP;
……
dataP = FrmGetGadgetData(pForm, FrmGetobjectIndex(pForm, MainGadget));
if (dataP!=0)
dataP不是一个指针吗?这里可以这样写么?


公主未成年 2008-6-1 03:32

强贴留名
页: [1]
查看完整版本: 写出来的程序会Fatal Exception希望DX指点!