0

なんらかの理由でforループインgetLettersがクラッシュを引き起こします。

その中の特定のソースを選び出すことができませんでした。誰かが助けてくれるでしょうか?

ポインターを間違って作成した可能性があると思います。これを修正するにはどうすればよいですか?

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


int main() {
    FILE *ifp;
    ifp = fopen("dictionary.txt", "r");
    int* lValues[26];
    int* lDist[26];
    int* lUsed[26];
    int*fRun = 0;
    int dictLen;
    int i;
    int bestValue;
    fscanf(ifp, "%d", &dictLen);
    char bestWord[7];
    char dictionary[dictLen][7];
    char* letters[7];
    char* userWord[7];

    //reads the dictionary into the array
    for (i = 0; i < dictLen; i++) {
        fscanf(ifp, "%s", &dictionary[i]);
    }

    distribution();
    values();

    while (i != 2) {

        getLetters();

        printf("Welcome to the Scrabble Practice Program!\n");
        printf("\nHere are your letters: %s \n", letters);
        printf("\nWhat would you like to do?\n");
        printf("\t1-Enter Word\n");
        printf("\t2-Quit\n\n");
        printf("User Selection:");
        scanf("%d", &i);
    }

    //fclose(ifp); not sure why, but this crashes the program

    return 0;
}

//Gets the user's set of letters
void getLetters() {
    char* letters[7];
    int* lDist[26];
    int* lUsed[26];
    int lCur;
    int i;

    srand(time(0));

    for (i = 0; i < 7; i++) {

        *letters[i] = 65 + rand()%26;
        lCur = (int)*letters[i] - 65;

        while (*lUsed[lCur] >= *lDist[lCur]){

            *letters[i] = 65 + rand()%26;
            lCur = (int)*letters[i] - 65;
        }

        *lUsed[lCur]++;
    }
}

//Sets the number of each letter available for distribution
void distribution() {
    int* lDist;

    //Number for A
    lDist[0] = 9;

    //Number for B
    lDist[1] = 2;

    //Number for C
    lDist[2] = 2;

    //Number for D
    lDist[3] = 4;

    //Number for E
    lDist[4] = 12;

    //Number for F
    lDist[5] = 2;

    //Number for G
    lDist[6] = 3;

    //Number for H
    lDist[7] = 2;

    //Number for I
    lDist[8] = 9;

    //Number for J
    lDist[9] = 1;

    //Number for K
    lDist[10] = 1;

    //Number for L
    lDist[11] = 4;

    //Number for M
    lDist[12] = 2;

    //Number for N
    lDist[13] = 6;

    //Number for O
    lDist[14] = 8;

    //Number for P
    lDist[15] = 2;

    //Number for Q
    lDist[16] = 1;

    //Number for R
    lDist[17] = 6;

    //Number for S
    lDist[18] = 4;

    //Number for T
    lDist[19] = 6;

    //Number for U
    lDist[20] = 4;

    //Number for V
    lDist[21] = 2;

    //Number for W
    lDist[22] = 2;

    //Number for X
    lDist[23] = 1;

    //Number for Y
    lDist[24] = 2;

    //Number for Z
    lDist[25] = 1;
}


//Sets the value of all of the letters
void values() {

    int* lValues;

    //Value of A
    lValues[0] = 1;

    //Value of B
    lValues[1] = 3;

    //Value of C
    lValues[2] = 3;

    //Value of D
    lValues[3] = 2;

    //Value of E
    lValues[4] = 1;

    //Value of F
    lValues[5] = 4;

    //Value of G
    lValues[6] = 2;

    //Value of H
    lValues[7] = 4;

    //Value of I
    lValues[8] = 1;

    //Value of J
    lValues[9] = 8;

    //Value of K
    lValues[10] = 5;

    //Value of L
    lValues[11] = 1;

    //Value of M
    lValues[12] = 3;

    //Value of N
    lValues[13] = 1;

    //Value of O
    lValues[14] = 1;

    //Value of P
    lValues[15] = 3;

    //Value of Q
    lValues[16] = 10;

    //Value of R
    lValues[17] = 1;

    //Value of S
    lValues[18] = 1;

    //Value of T
    lValues[19] = 1;

    //Value of U
    lValues[20] = 1;

    //Value of V
    lValues[21] = 4;

    //Value of W
    lValues[22] = 4;

    //Value of X
    lValues[23] = 8;

    //Value of Y
    lValues[24] = 4;

    //Value of Z
    lValues[25] = 10;
}
4

5 に答える 5

3
*letters[i] = 65 + rand()%26;

letter [i]は意味のない(初期化されていない)どこにも言及しておらず、最終的には。になる可能性がありますAccess violation fault

さらに遠く

char* letters[7];
int* lDist[26];
int* lUsed[26];

それらはすべて、arrays of pointer基本的な型(int、charなど)の配列ではありません。おそらくあなたが望んでいたと思います

char letters[7];//Array of seven characters
int lDist[26];//Array of 26 ints
int lUsed[26];//Array of 26 ints

*letters[i]単に次のように参照し始めますletters[i]

于 2012-09-13T16:59:56.187 に答える
1

letterslDistおよびlUsedはポインタの配列です(初期化されていません)。代わりに配列を使用してみませんか?

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

void getLetters(void)
{
    char letters[7];
    int lDist[26];
    int lUsed[26];
    int lCur;
    int i;

    srand(time(NULL));

    for (i = 0; i < 7; i++) {
        letters[i] = 65 + rand() % 26;
        lCur = (int) letters[i] - 65;

        while (lUsed[lCur] >= lDist[lCur]) {
            letters[i] = 65 + rand() % 26;
            lCur = (int) letters[i] - 65;
        }

        lUsed[lCur]++;
    }
}
于 2012-09-13T16:59:19.017 に答える
1

関数内のすべての配列アクセスはgetLetters問題を引き起こす可能性があります。初期化されないポインタの3つの配列を宣言するため、ガベージメモリアドレスを逆参照している配列の要素を逆参照するときはいつでも、それに書き込もうとすることがあります。メモリアドレス。

あなたのコードから、なぜポインタの配列が必要なのかは不明です。

なぜ単純ではないのですか?

char letters[7];
int lDist[26];
int lUsed[26];

そして、間接参照を取り除きますか?

しかし、それでも、関数には問題があります。少なくともlDist、との配列値を初期化する必要がありますlUsed。の要素と比較しますがlDist、それ以外の場合はこれらの値を変更しないでください。

于 2012-09-13T17:00:14.953 に答える
1

上記のコードが意図したとおりに機能していないようです。変数を宣言するとき

char* letters[7];

…7char *秒ではなく7char秒の配列を宣言しています。したがって、あなたが言うとき

*letters[i] = 65 + rand()%26;

…最初に配列にインデックスを付け、インデックスでポインタを取得しますi。次に、そのポインタを逆参照して、そこに文字を格納しようとします。問題は、letters初期化されることはなく、ジャンクでいっぱいになる可能性が高いことです。任意の値に対してiletters[i]ランダムな値が返されます。したがって、それをアドレスとして逆参照しようとすると、他の誰かのメモリにインデックスを付けていることになり、そこに書き込むとセグメンテーション違反が発生します。

あなたはそのように宣言するつもりだったようですletters(そしてlDistそしてlUsed):

char letters[7];
int lDist[26];
int lUsed[26];

これは、長さが7のsの配列を意味しcharます。次に、間接参照せずにそれらに対処します。

letters[i] = 65 + rand()%26;

上記を次のように行うこともできます…</p>

*(letters + i) = 65 + rand()%26;

…しかし、あなたは一般的に2つを一緒に混ぜるつもりはありません。

于 2012-09-13T17:10:03.380 に答える
0

ポインタを使用する必要はありません。プレーンな配列を使用すると、次のようになります (lUsed と lDist の初期化も追加しました)。

void getLetters() {
    char letters[7];
    int lDist[26];
    int lUsed[26];
    int lCur;
    int i;


    srand(time(0));

    // initialize the arrays
    for (i=0;i<26;i++) {
        lUsed[i] = lDist[i] = 0;
    }

    for (i = 0; i < 7; i++) {

        letters[i] = 65 + rand()%26;
        lCur = (int)letters[i] - 65;

        while (lUsed[lCur] >= lDist[lCur]){

            letters[i] = 65 + rand()%26;
            lCur = (int)letters[i] - 65;

        }

        lUsed[lCur]++;

    }
}
于 2012-09-13T17:02:22.960 に答える