一無是處 2015-07-25 14:45 采纳率: 0%
浏览 1727

滑雪问题因为全局变量产生的bug

谢谢大家的回答弱弱的题主已经明白了Orz

题目时经典的滑雪问题,最近帮别人查程序的时候看到的。

问题出在程序的第19行的变量tmpMax上。如果这个变量在函数体内声明,就是现在程序那样就不会有问题,但是如果将其定义为全局变量就会出问题。第一个出问题的地方是(2,3)点,我已经让程序在这里输出单步结果了。希望对C/C++熟悉的前辈能够解答一下这个问题,感激不尽!

debug中的代码如下:

 #include <iostream>
#include <stdio.h>
#include <memory.h>
//#include <conio.h>
using namespace std;
int skiing[110][110];
int done[110][110];
int R, C;
int Len = 0;
//int tmpMax;
int Ski(int a, int b){
    bool flag = false;
    if(a == 2 && b == 3){
        printf("dfs(%d %d)\n", a, b);
        flag = true;
    }
    //printf("dfs(%d %d)\n", a, b);
    if (done[a][b] != 0)
        return done[a][b];
    //tmpMax = 1    
    int tmpMax = 1;//警察叔叔就是这个变量!!!!
    if (a - 1 >= 1 && skiing[a - 1][b] < skiing[a][b]){
        int len = Ski(a - 1, b) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a-1, b, len);
        }
    }
    if (a + 1 <= R && skiing[a + 1][b] < skiing[a][b]){
        int len = Ski(a + 1, b) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a+1, b, len);
        }
    }
    if (b - 1 >= 1 && skiing[a][b - 1] < skiing[a][b]){
        int len = Ski(a, b - 1) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a, b-1, len);
        }
    }
    if (b + 1 <= C && skiing[a][b + 1] < skiing[a][b]){
        int len = Ski(a, b + 1) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a, b+1, len);
        }
    }

    done[a][b] = tmpMax;
    //printf("calc(%d %d) = %d\n", a, b, done[a][b]);
    return done[a][b];
}
int main(){
    cin >> R >> C;
    memset(skiing, 0, sizeof(skiing));
    memset(done, 0, sizeof(done));
    for (int i = 1; i < R + 1; ++i)
        for (int j = 1; j < C + 1; ++j)
            cin >> skiing[i][j];
    for (int i = 1; i < R + 1; ++i){
        for (int j = 1; j < C + 1; ++j){
            //done[i][j] = Ski(i, j);
            Ski(i, j);
            //cout << done[i][j] << " ";
            if (done[i][j] > Len)
                Len = done[i][j];
            //getch();
        }
        //cout << endl;
    }
    for (int i = 1; i < R + 1; ++i){
        for (int j = 1; j < C + 1; ++j){
            cout << done[i][j] << " ";
        }
        cout << endl;
    }
    cout << Len << endl;
    return 0;
}
  • 写回答

4条回答 默认 最新

  • oyljerry 2015-07-25 14:50
    关注

    tmpMax全局变量的区别就是Ski函数每次进入都会拿到上次的值,而如果是局部变量就会每次进入函数都会重新初始化为1。这两个明显会导致结果不一样。

    评论

报告相同问题?

悬赏问题

  • ¥15 我想在一个软件里添加一个优惠弹窗,应该怎么写代码
  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流