打印

数组中数据出错问题

[复制链接]
2450|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
youimiss|  楼主 | 2014-1-15 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2014-1-15 16:17 | 只看该作者
还是程序的问题

你换个地址,这里没有问题,其它地方就有错了

使用特权

评论回复
板凳
youimiss|  楼主 | 2014-1-15 16:22 | 只看该作者
ayb_ice 发表于 2014-1-15 16:17
还是程序的问题

你换个地址,这里没有问题,其它地方就有错了

老师,程序中就是定义数组、对数组赋值、读数组,这怎么查啊?实在无从下手啊

使用特权

评论回复
地板
ayb_ice| | 2014-1-15 16:31 | 只看该作者
上源程序

使用特权

评论回复
5
chenbb8| | 2014-1-15 17:13 | 只看该作者
出问题的应该是别的函数~这个函数只是中招而已

使用特权

评论回复
6
dirtwillfly| | 2014-1-15 21:21 | 只看该作者
建议楼主上代码

使用特权

评论回复
7
原野之狼| | 2014-1-16 09:04 | 只看该作者
公司另外一个组正在搞的一个项目  测试时运行十来天就崩溃一次  这样的bug都得解出来  所以楼主的问题不过是小case了  把源代码贴出来 坛子里高手如云

使用特权

评论回复
8
youimiss|  楼主 | 2014-1-16 09:32 | 只看该作者
dirtwillfly 发表于 2014-1-15 21:21
建议楼主上代码
void main(void)        
{
        if((PCON&0x10)==0)//如果POF位=0
        {
                PCON=PCON|0x10;                //将POF位置1
                ISP_CONTR=0x60;                //软复位,从ISP监控区启动}else{
                PCON=PCON&0xef;                //将POF位清零
       
        }
        AUXR = 0x00;
        while(1)
        {                                                                                                                                                                        
                Init();
                DelayMsNew(300);//Delay(30);//等待启动信号
                while(!Power_On);
                State = NORMAL;
               
                PowerOnSelfTest();        //开机自检
                if(LastError)

                        Power_On = FALSE;
                }
                else
                {
                        LoadSysParameter(0x00,0x00);  //从EEPROM读取系统状态
                        ReadFloatArr();//从EEPROM中读取配置参数
                        DelayMsNew(100);
                        SendTestOver2Panel();//发送测试结束信号
                        OutputData(CS6,ExposelStartSet(MOTOR_STOP,FocusLorS,FIL_ON));//输出设置
                        StartFILTestTimer(FirstCheckFIL_ITime);                                                               
                }
                while(Power_On)                //等待关机信号
                {
                        SetBaseFILIAndKV(FALSE);
                        FILTestNorCount();                  
                        switch(ProcessedCMD)
                        {
                                case CMD_SEND_EXPTEST_P2C:
                                {
                                        SendExpNumTest();
                                        ProcessedCMD=0;
#ifdef SPOTFILM
                                        if(SpotEnable&&(TubChange==0)&&!PerspectiveEnableFlag)          
                                                OutputSpotFilmData(SpotFilmAction(DoNot,DoNot,EXP11,DoNot));
#endif
                                        break;
                                }  
                                case CMD_SEND_EXP1_P2C:         
                                {       
                                        State = NORMAL;       
                                        WaitExposeAction();  //出错数组在这里
                                        State = NORMAL;
                                        SetBaseFILIAndKV(TRUE);       
                                        StartFILTestTimer(FirstCheckFIL_ITime);
                                        break;
                                }
                .
                .
                .
/*****************************************************************************/
void WaitExposeAction()
{
        uchar OldP2 = P2;
        ulint j;
        unsigned long Count=0;
        StopFlagDelay();
        if((Expose1Step == 1) && (!LastError))
         {
                Expose1StepAction();//出错在这里。。。
             OutputData(CS6,ExposelStartSet(MOTOR_START,FocusLorS,FIL_ON));
        Expose1StepSelfTest();/
#ifdef SPOTFILM
                if((SpotEnable==1)&&(TubChange==0)&&!PerspectiveEnableFlag)       
                {
                        OutputSpotFilmData(SpotFilmAction(Ready,DoNot,EXP11,DoNot));
                        for(j=0;j<20000;j++)
                        {
                                if(P16==0) break;
                        }
                        if(j>19999)
                        {
                                LastError = ERR_TV;       
                                SendError();//发送错误报告
                        }
                 }
#endif



/*****************************************************************************/
void Expose1StepAction()
{                                               
        if(State != CancelEXP)
        {
#ifdef IBS_Mod
                if(IBS_FLAG)
                {
                         PresetKV = 70;
                        PresetMA = 1.0;
                }               
#endif
                //OutputData(CS6,ExposelStartSet(MOTOR_START,FocusLorS,FIL_ON));//电机启动
                ControlFILI_Ref_EXP1(PresetKV,PresetMA);//出错在这里
                ControlKV_Ref_EXP1(PresetKV);

        }
}
/*****************************************************************************/
void ControlFILI_Ref_EXP1(uchar KVt, float MAt)
{

#ifdef PERSPECTIVE
        if(PerspectiveEnableFlag)
        {
                RefFIL_I=PerspectiveRefFIL_I_Digit(KVt,MAt);
        }
        else
#endif
        {
                RefFIL_I=RefFIL_I_Digit(KVt,MAt);//出错在这里,RefFIL_I是float型,函数返回的是uchar,这样应该没问题吧

        }
        RefFIL_I = (RefFIL_I>255)?255:RefFIL_I;
        RefFIL_I = (RefFIL_I<0)?0:RefFIL_I;
        FIL_I_REF_ADR =        RefFIL_I;
}
/*****************************************************************************/
uchar RefFIL_I_Digit(uchar KV_Line,float MA_Low)
{
    uchar Line,Low;//行,列数
        Line=FindKV_FIL_Row(KV_Line);
        Low =FindNearestMA_Pos(MA_Low);
        return Soft_FIL_Table[Low][Line];// Soft_FIL_Table[11][16]是全局变量,定义在片内扩展的xdata,这个数组初始值是从EEPOM中获取的,获取后我把数据全部发送到PC上查看没问题,但是上一个函数中FIL_I_REF_ADR =        RefFIL_I;(DA输出,#define FIL_I_REF_ADR XBYTE[0xafff])有5个数据不对,而且这五个异常数据都不属于Soft_FIL_Table[11][16]
}

使用特权

评论回复
9
youimiss|  楼主 | 2014-1-16 09:35 | 只看该作者
原野之狼 发表于 2014-1-16 09:04
公司另外一个组正在搞的一个项目  测试时运行十来天就崩溃一次  这样的bug都得解出来  所以楼主的问题不过 ...

早就想贴了,只不过不知道如何组织才能让大家看得懂,代码如上,请胖哥多多指点啊

使用特权

评论回复
10
youimiss|  楼主 | 2014-1-16 09:37 | 只看该作者
ayb_ice 发表于 2014-1-15 16:31
上源程序

老师,代码贴出来了,不知道能不能看出问题来

使用特权

评论回复
11
ayb_ice| | 2014-1-16 09:41 | 只看该作者
编译有没有警告(注意不要禁止警告)

使用特权

评论回复
12
youimiss|  楼主 | 2014-1-16 09:46 | 只看该作者
ayb_ice 发表于 2014-1-16 09:41
编译有没有警告(注意不要禁止警告)

有一个递归调用的警告(不是上面贴出来的函数,但我也不知道怎么递归了),几个函数定义了没用的警告(这个没问题吧),几个函数主函数调用了中断也调用了的警告(看了一下不会出现同时调用,所以没理)

使用特权

评论回复
13
ayb_ice| | 2014-1-16 11:03 | 只看该作者
youimiss 发表于 2014-1-16 09:46
有一个递归调用的警告(不是上面贴出来的函数,但我也不知道怎么递归了),几个函数定义了没用的警告(这 ...

这问题不就出来了

这种警告有可能有严重问题

如果实际确实发生了递归调用,结果肯定错的,因为局部变量会被告覆盖

简单解决办法

调用前关中断,调用后开中断

使用特权

评论回复
14
youimiss|  楼主 | 2014-1-16 11:17 | 只看该作者
ayb_ice 发表于 2014-1-16 11:03
这问题不就出来了

这种警告有可能有严重问题

我现在消除了递归调用的警告了,还是会出错。。。

使用特权

评论回复
15
江枫渔火| | 2014-1-16 12:16 | 只看该作者
每解决一个BUG,经验值增加1点,经验值达到一定数量时,就升级了~等到接近满级的时候,就达到了眼里无BUG的境界了。骚年,赶紧打怪升级吧

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
youimiss + 1 同意!
16
w522930954| | 2014-1-16 13:15 | 只看该作者
Line=FindKV_FIL_Row(KV_Line);
        Low =FindNearestMA_Pos(MA_Low);
这两个数不怕超限么?
串口一直发数组出来看看好了,要是数组出错一下就看出来了,万一是你计算出错取错地址了也说不定啊?

使用特权

评论回复
17
ayb_ice| | 2014-1-16 13:15 | 只看该作者
全程禁止中断,如果还有问题,可能是其它问题

使用特权

评论回复
18
youimiss|  楼主 | 2014-1-16 13:56 | 只看该作者
w522930954 发表于 2014-1-16 13:15
Line=FindKV_FIL_Row(KV_Line);
        Low =FindNearestMA_Pos(MA_Low);
这两个数不怕超限么?

限了,还是有问题
//        Line = Line>KV_Table_Step_SIZE?KV_Table_Step_SIZE:Line;
//        Line = Line<0?0:Line;
//        Low = Low>MA_Table_SIZE?MA_Table_SIZE:Low;
//        Low = Low<0?0:Low;

使用特权

评论回复
19
w522930954| | 2014-1-16 13:59 | 只看该作者
是数组出错还是返回值出错?怎么描述的像是返回值出错了。。

使用特权

评论回复
20
xlsbz| | 2014-1-16 14:32 | 只看该作者
只能慢慢找。一点点的删代码。就看出来了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:不卖开发板! http://minifairyfly.taobao.com/

43

主题

1097

帖子

1

粉丝