-2

プログラムを実行すると、セグメンテーション違反が発生し続けます。通常、セグメンテーション違反は、コンピューターが物理的にアドレス指定できないメモリにプログラムがアクセスしようとしたときに発生すると想定されています。どこに問題があるのか​​特定できません。

編集:変数をスキャンするときに&を追加しましたが、セグメンテーション違反の問題は解決しません

これが私のコードです:

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


    void userEnter(int*pattern, int n);
    void print( int * s, int n);
    void recurs( int * s, int * a, int n, int wpegs, int bpegs);
    bool Done (int*s);
    bool bPegs(int*a ,int*s, int bpegs, int wpegs, int n);
    bool wPegs(int* modcom, int* modoriginal, int*s, int wpegs, int w);
    void change(int*modoriginal, int*modcom, int i, int k, int w);

    int main(void)
    {
        int i, n, bpegs, wpegs;

        printf("Enter the pattern length: ");
        scanf("%d",&n);
        int *a = (int*)malloc((n)*(sizeof(int)));
        printf("Input the guess pattern: ");
        int pattern[n];
        userEnter(pattern, n);  
        printf("Enter the number of black pegs in the feedback: ");
        scanf("%d",&bpegs);
        printf("Enter the number of white pegs in the feedback: ");
        scanf("%d",&wpegs);
        printf("The possible key patterns are: ");
        for(i=0; i<=n-1; i++)
        {
            a[i]=0;
        }
        print(a, n);
        recurs(a, pattern, n, wpegs, bpegs);

    }

    void userEnter(int*pattern, int n)
    {
        char input[n];
        scanf("%s",&input);

        int i;
        for(i = 0; i < n-1; i++)
        {
            pattern[i] = input[i]-65;
        }
    }

    void print( int * s, int n)
    {
        int i; 
        printf( "\n" );
        for( i = n-1; i >= 0; i-- )
        {
            printf( "%c", ( s[ i ] + 65 ) );
        }
    }

    void recurs( int * s, int * a, int n, int wpegs, int bpegs)
    {

        int i;

        if(Done(s))
        {
            print( s, n);
            printf( "\nAccomplisshed!\n" );
        }

        else{
            s[ 0 ] += 1;
            for( i = 0; i < n-1; i++ )
            {
                if( s[ i ] == 6 ){
                    s[ i ] = 0;
                    s[ i + 1 ] += 1;
                }
            }
            if(bPegs(a ,s, bpegs, wpegs, n))
            {
            print( s, n);
            }
            recurs(s, a, n, wpegs, bpegs);
        }
    }

    bool Done (int*s)
        {
            int i;
            bool done=true;
            for (i=0;i<=11;i++)
            {
                if(s[i]!=5)
                {
                    done=false;
                }
            }
            return done;
        }


    bool bPegs(int*a ,int*s, int bpegs, int wpegs, int n)
    {
        int i,j,c=0;
        bool d = false;
        for(i=0; i<n-1; i++)
        {
            if(a[i]==s[i])
            {
                c++;
            }
        }
        int x =n-c;
        int* modcom; 
        int*modoriginal;
        modcom=(int*)malloc((x)*(sizeof(int)));
        modoriginal=(int*)malloc((x)*(sizeof(int)));
        int w=0;
        for(j=0; j<n-1; j++)
        {
            if(a[j]!=s[j])
            {
                modcom[w]=s[j];
                modoriginal[w]=a[j];
                w++;
            }       
        }
        if(c==bpegs)
        {
            d = wPegs(modcom, modoriginal, s, wpegs, w);
        }

        return d;

    }

    bool wPegs(int*modcom, int*modoriginal, int*s, int wpegs, int w)
    {
        int i, k, count=0;
        for(i=0; i<=w; i++)
        {
            for(k=0; k<=w; k++)
            {
                if (modoriginal[i]==modcom[k])
                {
                    count++;
                    change(modoriginal, modcom, i, k, w);
                }
            }
        }
        if(wpegs==count)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

    void change(int*modoriginal, int*modcom, int i, int k, int w)
    {
        int c, o;
        for(c=i-1; c<w-1; c++)
        {
            modoriginal[c]=modoriginal[c+1];
        }
        for(o=k-1;o<w-1;o++)
        {
            modcom[o]=modcom[o+1];
        }
    }
4

4 に答える 4

3

scanfコンパイラによって報告されるように、引数を適切に渡していないため:

13421173.c:25: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
13421173.c:25: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
13421173.c:27: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
13421173.c:27: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’

正しい使い方は次のようになります。

scanf("%d", &bpegs);
于 2012-11-16T17:08:58.523 に答える
1

すべてのコードをチェックしたわけではありませんが、変更する必要があります

scanf("%d",bpegs);
printf("Enter the number of white pegs in the feedback: ");
scanf("%d",wpegs);

scanf("%d",&bpegs);
printf("Enter the number of white pegs in the feedback: ");
scanf("%d",&wpegs);

つまり、scanf に書き込みたい int へのポインタを渡します。

于 2012-11-16T17:08:36.253 に答える
1

の引数scanfは、フォーマットと、同じタイプのフォーマットの変数へのポインターです。整数型の場合は%d&d を要求します。ここで、d は 型intです。userEnter()関数の入力のような文字列の場合%s、タイプchar*が必要です。入力は配列です。つまり、中括弧のない入力はすでにポインターであるため、次のように書くだけです

scanf("%s",input);

また、forcicles の制限を確認する必要があります。たとえば、サイズx = n - cbPegs()の modcom と modoriginal にメモリを割り当てており、次の cicle で制限が n-1 になると、c = 1 でない限り、セグメンテーション違反が発生します。

于 2012-11-16T18:09:39.017 に答える
0

何かのようなもの:

scanf("%d",bpegs);

int から int ポインターへの暗黙的なキャストを行い、読み取った整数がランダムなアドレスに書き込まれるようにします。このランダムなアドレスは、初期化されていない bpegs の値に依存します。scanf を何度も使用した場合は、これらのエラーをすべて修正し、値ではなく、変更する値のアドレスを渡します。

于 2012-11-16T17:11:30.607 に答える