| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 365 人关注过本帖
标题:我发现一个很奇怪的事情 , 关于全局变量的 ,求指教
只看楼主 加入收藏
windthenrain
Rank: 2
等 级:论坛游民
帖 子:21
专家分:15
注 册:2014-10-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
我发现一个很奇怪的事情 , 关于全局变量的 ,求指教
输入:
3
0 990 692
990 0 179
692 179 0
1
1 2
看代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
#define S 110
struct edge
{
    int u , v , w ;
}e[S * S];
int  p[S],n , m;//一开始,三个全局变量位置

void init ()//初始化而已
{
    for(int i = 1 ; i <= S ; i++)
        p[i] = i ;
}

bool cmp (edge a , edge b)
{
    return a.w < b.w ;
}

int find (int x)
{
    return x == p[x] ? x : p[x] = find(p[x]) ;
}

void kruskal ()
{
    sort (e + 1 , e + m , cmp) ;
    int ans = 0 , x , y ;
    for (int i = 1 ; i < m ; i++) {
        x = find (e[i].u) ;
        y = find (e[i].v) ;
        if (x != y) {
            ans += e[i].w ;
            p[x] = y ;
        }
    }
    printf ("%d\n" , ans) ;
}
int main ()
{
    freopen ("a.txt" , "r" ,stdin) ;
    int k , built ;
    int x , y ;
    while (~ scanf ("%d" , &n ) ) {
        printf ("n=%d\n" , n ) ;//第一次输出n
        init () ;
        m = 1 ;
        printf ("n = %d\n" ,n) ;//第二次输出n
        return 0 ;
        for (int i = 1 ; i <= n ; i++) {
            for (int j = 1 ; j <= n ; j++) {
                if (j <= i) {
                    scanf ("%d" , &k ) ;
                    continue ;
                }
                scanf ("%d" , &e[m].w) ;
                e[m].u = i ;
                e[m].v = j ;
                printf ("%d:u=%d v=%d w=%d\n" , e[m].u , e[m].v , e[m].w ) ;
                m++ ;
            }
        }
       // return 0;
        scanf ("%d" , &built );
        for (int i = 0 ; i < built ; i++) {
            scanf ("%d%d" , &x , &y ) ;
            x = find (x) ;
            y = find (y) ;
            p[x] = y ;
        }
        kruskal () ;
    }
    return 0 ;
}
输出(仅是n的部分):
n=3
n = 110

可以看到进行init()操作后,n的值变了 ,为啥?而且貌似变成的是 S 的值

但如果把声明全局量时的顺序变成:int n , p[S] , m;

输出就成了:
n=3
n = 3

能帮我解释下吗 = i =
搜索更多相关主题的帖子: include return 
2015-02-12 21:21
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:20 
好像是你的数组下标溢出到变量n的位置了,如果全局量时的顺序变成:“int n , p[S] , m”,你会发现m又变成110了。
看来c的数组下标和vb的一样,都是从0开始的,因此你定义的110个元素的数组,下标是从0-109,如果数组下标是110就溢出,vb里会提示出错,c不会。把init函数里的p[i] = i 语句改成p[i-1] = i 应该就行。
2015-02-12 22:13
windthenrain
Rank: 2
等 级:论坛游民
帖 子:21
专家分:15
注 册:2014-10-27
收藏
得分:0 
原来如此
谢谢啦
2015-02-13 08:49
快速回复:我发现一个很奇怪的事情 , 关于全局变量的 ,求指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016741 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved