C++编写函数内调用数组时遇到问题,求解TAT

问一下佬们这是什么情况,代码用C++写的,数组能在函数里面去定义到源文件,但是我把temp = 0注释掉,编译不通过,貌似是找不到数组,但是却可以去定义啊!!
上面这个情况主函数调用了这个函数
还有就是如果主函数不调用这个函数也不会报错
有知道的嘛求解!

img

img

img

你声明了数组,但是我好像没有看到数组的初始化?
你没有初始化,却去读取其中的数据,肯定有问题
所以在读取到未初始化的数据以后,还要再用temp,因为之前里面的数据是未知的

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    该问题涉及到渡河问题,需要将农夫、羊、狼、菜带过河,在渡河过程中需要遵守一些条件,如船只能装下农夫和一个角色,羊吃菜,狼吃羊等。根据参考资料中提供的算法设计,可以通过枚举的方式来解决该问题。以下是具体的解决方案:

    1. 首先,定义一个包含4个角色状态的结构体 State ,其中,h 表示农夫,w 表示狼,s 表示羊,v 表示菜。用 0 和 1 表示未渡河和已渡河的状态。
    struct State {
        int h; // 人
        int w; // 狼
        int s; // 羊
        int v; // 菜
    };
    
    1. 实现一个渡河函数 pass ,用于根据角色进行状态切换。其中,参数 s 为当前状态结构体,参数 role 为要渡过河的角色。根据角色的不同,切换对应的状态。在切换状态之前,需要先切换农夫的状态。
    State pass(State s, char role) {
        s.h = 1 - s.h; // 切换农夫的状态
    
        if(role == '-') {
            // 什么都不做
        } else if(role == 'W') {
            s.w = 1 - s.w; // 切换狼的状态
        } else if(role == 'S') {
            s.s = 1 - s.s; // 切换羊的状态
        } else if(role == 'V') {
            s.v = 1 - s.v; // 切换菜的状态
        } else {
            // 其他情况,直接崩溃
            assert(0);
        }
    
        return s;
    }
    
    1. 定义一个布尔型的四维数组 passed ,用于标记已尝试的策略。数组大小设为 2 * 2 * 2 * 2 ,表示农夫、狼、羊、菜的状态组合。
    bool passed[2][2][2][2];
    
    1. 实现一个检测状态是否合法的函数 invalid_state_check ,用于判断当前状态是否满足条件。具体条件为:人和羊不在同一边时,且羊和狼在同一边或羊和菜在同一边。
    bool invalid_state_check(State s) {
        if(s.h != s.s && (s.s == s.w || s.s == s.v)) {
            return true; // 状态不合法
        }
    
        return false; // 状态合法
    }
    
    1. 实现一个检测是否为最终状态的函数 final_state_check ,用于判断当前状态是否为最终过河的状态,即人、狼、羊、菜都已经渡过了河。
    bool final_state_check(State s) {
        if(s.h == 1 && s.w == 1 && s.s == 1 && s.v == 1) {
            return true; // 是最终状态
        }
    
        return false; // 不是最终状态
    }
    
    1. 定义一个字符数组 result ,用于存储最终结果的渡河路径。
    char result[1000];
    
    1. 实现一个打印结果的函数 print_result ,用于打印出当前已经进行的渡河步骤。参数 step 表示当前步骤数。
    void print_result(int step) {
        for(int i = 0; i < step; i++) {
            if(i != 0) {
                printf(" ");
            }
            printf("H");
            if(result[i] != '-') {
                printf("%c", result[i]);
            }
        }
        puts("");
    }
    
    1. 实现一个 go 函数,用于根据当前状态进行递归的渡河尝试。其中,参数 s 表示当前状态,参数 step 表示当前步骤数。
    bool go(State s, int step) {
        // 检测状态是否合法
        if(invalid_state_check(s)) {
            return false; // 不合法,结束该尝试
        }
    
        // 检测是否为最终状态
        if(final_state_check(s)) {
            // 打印结果
            print_result(step);
            return true; // 找到一个可行方案,结束该尝试
        }
    
        // 检测是否已经尝试过该策略
        if(passed[s.h][s.w][s.s][s.v]) {
            return false; // 已尝试过,结束该尝试
        }
    
        // 标记该策略已经尝试过
        passed[s.h][s.w][s.s][s.v] = true;
    
        // 处理下一个状态
        State ns;
        ns = pass(s, '-');
        result[step] = '-';
        if(go(ns, step+1)) return true;
    
        if(s.h == s.w) {
            result[step] = 'W';
            ns = pass(s, 'W');
            if(go(ns, step+1)) return true;
        }
    
        if(s.h == s.s) {
            result[step] = 'S';
            ns = pass(s, 'S');
            if(go(ns, step+1)) return true;
        }
    
        if(s.h == s.v) {
            result[step] = 'V';
            ns = pass(s, 'V');
            if(go(ns, step+1)) return true;
        }
    
        return false;
    }
    
    1. main 函数中,初始化 passed 数组,并定义初始状态 init_state ,然后调用 go 函数进行渡河的尝试。
    int main() {
        memset(passed, 0, sizeof(passed));
    
        State init_state = {0, 0, 0, 0};
        go(init_state, 0);
    
        return 0;
    }
    

    通过以上的具体解决方案,可以解决该问题,实现通过C++编写函数内调用数组。如果编译器报错找不到数组或者注释掉 temp = 0 后无法通过编译的问题,可能是在其他地方对数组 temp 进行了引用或者使用,导致编译器不能优化掉该数组的定义。此外,如果主函数不调用该函数,也不会报错,可能是因为数组 temp 没有被使用到,所以没有发生冲突。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^