0

私が直面したことを見てもらえますか: http://sdrv.ms/WgafvN

そして別のスクリーンショット: http://sdrv.ms/UZIp6H

私の関数のテキストは次のとおりです。

bool print_all_points(POINT** pointer)
{

    if (pointer == NULL||is_array_empty(pointer)) 
    {
        cout << "The array of points is empty." << endl << endl;
        return false;
    }
    else
    {
        int n = _msize(pointer)/sizeof(pointer[0]);
        cout << "The list of points: " << endl<< endl;
        cout << "id (x, y)" << endl;
        cout << "----------" << endl;
        for (int i = 0; i < n; i++)
        {
            cout << (*pointer[i]).id << " (" << (*pointer[i]).x << ", " << (*pointer[i]).y << ")" << endl;      
        }
    }
    return true;
}

この関数は、配列内のすべてのポイントを出力することが期待されています。私の問題は、4 点の配列ではなく 3 点の配列を完全に印刷することです。4点目でゴミに食い込みます。

何が問題なのかわかりません。図から次のことがわかります。 1. 配列の 4 つの要素がすべて存在します。2. 4 つあると正しく判断されます。

何が問題ですか?ここでキックしてもらえますか?

後で追加。

これを呼び出す関数:

POINT**  new_point(POINT** pointer, int occup)
{
    char x;
    char y;
    system("cls");
    cout << "INPUT A NEW POINT" << endl << endl;
    cout << "Input x: ";
    cin >> x;
    cout << "Input y: ";
    cin >> y;
    size_t m;
    if (pointer != NULL)
    {
        m = _msize(pointer);
    }

    POINT * tmp_point = new POINT();
    (*tmp_point).id = occup;
    (*tmp_point).x = x-48;
    (*tmp_point).y = y-48;  

    POINT** pn = new POINT * [occup];
    int necessary_memory = occup * 4; // ???? 4 is the size of a pointer.
    if (occup !=1)
    {
        memcpy(pn, pointer, necessary_memory);      
    }
    POINT ** tmp = new POINT * [occup];
    pn[occup - 1] = tmp_point;
    memcpy(tmp, pn, occup * sizeof(POINT)); 
    delete[] pn;
    pn = tmp;   
    size_t n = _msize(pn);
    cout << endl;
    print_all_points(pn);
    return pn;
}
4

1 に答える 1

1

いくつかの問題:

  • 64ビットで十分なデータをコピーしていません

    int necessary_memory = occup * 4;
    

    する必要があります

    int necessary_memory = occup * sizeof(POINT*);
    
  • コピーしすぎるデータ

    memcpy(tmp, pn, occup * sizeof(POINT)); 
    

    次のようにする必要があります。

    memcpy(tmp, pn, occup * sizeof(POINT*)); 
    
  • 他の誰かが参加することはできますが、new によって割り当てられたメモリで _msize を使用する必要があるかどうかはわかりません。そうですか? http://msdn.microsoft.com/en-us/library/z2s077bc(v=vs.80).aspx

  • タイトルの関数は関数でなければなりません

どういたしまして。あなたは私にビールを借りています。

そうそう、靴を見つけました...どこにしますか?

于 2013-01-20T18:07:07.723 に答える