1

学校での課題の場合、構造体を使用して、無限の量の行列に対して無限の量のポイントを格納できる行列を作成する必要があります。(理論上の無限)

割り当てには、callocとreallocを使用することにしました。マトリックスのサイズは次のとおりです。ポイントの制限に達するたびにサイズが2倍になります(つまり、1から始まり、2、4というように続きます)。また、マトリックスが追加されるたびにサイズが2倍になります。

これが私の問題です。最初の行列が追加され、2番目の行列の名前とポイントが追加されると、次のようになります。

B???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

Bは私が欲しい部分です(後でstrcmpを使用するので)が、?マークはそこにあるはずではありません。(明らかに)

なぜそれが正確にこれを行っているのかわかりません。コードはモジュール式であるため、コードの一部を取得して、これがどのように行われているのかを正確に示すことは簡単ではありません。

注:次の方法でマトリックスのポイントにアクセスできます:(MyMatrix[1].points[0].x_cord;これは単なる例です)

問題を引き起こすサンプルコード:

構造体:

 struct matrice {
    char M_name[256];
    int num_points[128];
    int set_points[128];
    int hasValues[1];
    struct matrice_points * points;
} * MyMatrix;
struct matrice_points {
    int set[1];
    double cord_x;
    double cord_y;
};

マトリックス関数の設定:

void setupMatrix(){

    MyMatrix = calloc(1, sizeof(*MyMatrix));
    numMatrix = 1;

}

行列関数の成長:

void growMatrix(){

    MyMatrix = realloc(MyMatrix, numMatrix * 2 * sizeof(*MyMatrix));
    numMatrix = numMatrix * 2;

}

行列を一度大きくした後にこの問題を出力する行列関数を追加します。

void addMatrix(char Name, int Location){

    int exists = 0;
    int existsLocation = 0;
    for (int i = 0; i < numMatrix; i++){
        if (strcmp(MyMatrix[i].M_name, &Name) == 0){
            exists = 1;
            existsLocation = i;
        }
    }

    *MyMatrix[Location].M_name = Name;
    printf("Stored Name: %s\n", MyMatrix[Location].M_name);
    *MyMatrix[Location].num_points = 1;
    *MyMatrix[Location].set_points = 0;
    *MyMatrix[Location].hasValues = 1;
    MyMatrix[Location].points = calloc(1, sizeof(*MyMatrix[Location].points));

}
4

3 に答える 3

0

データの末尾に '\0' を追加してみてください。

于 2011-03-19T09:52:07.973 に答える
0
*MyMatrix[Location].M_name = Name;

ここでは、文字列ではなく単一の文字をコピーしています。文字列がName必要な場合は、 として定義char *する必要があり、 を使用する必要がありますstrcpy

于 2011-03-19T09:55:14.183 に答える
0
void addMatrix(char Name, int Location)

char Name単一charの 、つまり整数型の数量を表します。char単なる数字であり、文字列ではありません。

これを行う場合:

strcmp(..., &Name)

その1文字が格納されている場所が有効なC文字列を表していると想定しています。これは間違っています。そうすべき理由はありません。この関数に C 文字列を渡したい場合は、次のように宣言する必要があります。

void addMatrix(char *Name, int Location)

次に、その C 文字列を行列構造の適切な場所にコピーする必要があります。次のようになります。

strncpy(... .M_name, Name, max_number_of_chars_you_can_store_in_M_Name);

また、これらのフィールド定義は構造体では奇妙です:

int num_points[128];
int set_points[128];
int hasValues[1];

つまり、構造体には、num_points と呼ばれる 128 個の int の配列、set_points と呼ばれる 128 個の int の別の配列、および hasValues と呼ばれる 1 つの int (奇妙な) の配列が含まれます。合計ポイントと設定ポイントのカウント、および値が保存されているかどうかを示すフラグのみを保存する必要がある場合、定義は次のようになります。

int num_points;
int set_points;
int hasValues;

関数の割り当てを修正しますaddMatrix

これらの配列が必要な場合は、割り当ても間違っています。

コンパイラですべての警告をオンにしてください。

于 2011-03-19T09:58:18.260 に答える