这个C代码的问题

时间:2015-11-04 21:04:12

标签: c

我构建了一个自动应用D' Hondt Law的C代码。所以我使用NetBeans 8.0.2在C语言上完成了它。我正在尝试编译它(没有错误)并且它给出了此消息RUN FAILED (exit value 1, total time: 4s)。我检查了很多次没有结果,这就是我在这里问的原因。我很感激一些帮助。的解决

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int LerDeputados() {
    int d;
    printf("Indique o número de deputados a repartir: ");
    scanf("%d",&d);    
    return d;
}

int LerPartidos() {
    int n;
    printf("Introduza o número de partidos: ");
    scanf("%d",&n);
    return n;
}

int main(void) {
    int d, n, i, k, m, j, z, x, aleatorio, b, dip[1000];
    float e[1000][1000], maximo[1000], v[1000];
    d= LerDeputados();
    n= LerPartidos();

    srand(time(NULL));
    aleatorio=rand();

    do{
        i++;
        printf("Número de votos do %dº partido: ",i);
        scanf("%f",&v[i]);       
    }while(i<n);

    for(j=1;j<=d;j++){
        for(k=1;k<=i;k++){
            e[j][k]=v[k]/j;
        }         
    }
    for(x=1;x<=n;x++) {
        dip[x]=0;
    }

    for(m=1;m<=d;m++){
        maximo[m]=0;
        for (j=1;j<=d;j++) {
            for (k=1;k<=i;k++) {
                if (e[j][k]>maximo[m]) {
                    maximo[m] = e[j][k];
                    z=j;
                    x=k; 

                }
                else if (maximo[m]==e[j][k]) {
                    if(v[k]>v[x]) {
                        maximo[m] = e[j][k];
                        z=j;
                        x=k; 
                    }
                    else if(v[k]<v[x]) {                        
                    }
                    else {
                        if(aleatorio%2==0){
                            maximo[m] = e[j][k];
                            z=j;
                            x=k;                           
                        }
                    }
                }    
            }
        }
        dip[x]=dip[x]+1;
        e[z][x]=0;                     
    }

    printf("\n");

    for(b=1;b<=n;b++) {
        printf("\nO partido %d acadou %d diputados.",b,dip[b]);
    }

    return 0;
}

如何将此代码实现为可在main上运行的函数?

 for(m=1;m<=d;m++){
        maximo[m]=0;
        for (j=1;j<=d;j++) {
            for (k=1;k<=i;k++) {
                if (e[j][k]>maximo[m]) {
                    maximo[m] = e[j][k];
                    z=j;
                    x=k; 

                }
                else if (maximo[m]==e[j][k]) {
                    if(v[k]>v[x]) {
                        maximo[m] = e[j][k];
                        z=j;
                        x=k; 
                    }
                    else if(v[k]<v[x]) {                        
                    }
                    else {
                        if(aleatorio%2==0){
                            maximo[m] = e[j][k];
                            z=j;
                            x=k;                           
                        }
                    }
                }    
            }
        }
        dip[x]=dip[x]+1;
        e[z][x]=0;                     
    }

1 个答案:

答案 0 :(得分:0)

两个问题:

首先,main中有一些非常大的数组,它们在堆栈上分配。这可能会导致堆栈溢出问题。

将这些大型数组声明为全局变量,或使用malloc动态分配它们。

第二个问题是,在进入第一个i循环时,do...while未初始化。此值可以是任何值,因此可能导致从数组v的末尾开始索引,从而导致未定义的行为。这是导致程序崩溃的原因。改变阵列大小后它没有崩溃的事实就是运气。对代码的任何其他更改都可能导致崩溃重新出现。

i设为0,你应该没问题。

i=0;
do{
    i++;
    printf("Número de votos do %dº partido: ",i);
    scanf("%f",&v[i]);
}while(i<n);

编辑:

关于创建一个函数块,你提到了一个函数,将main中定义的仅在此块中使用的变量移动到该函数中,并传入main使用的其余参数。 / p>