Как можно передать динамический массив из метода в C ++? - PullRequest
0 голосов
/ 15 февраля 2012

Я пытаюсь передать пару указателей в массив, прочитать файл, содержащий массивы точек, динамически распределить массивы для хранения этих точек и получить доступ к этим массивам вне функции с помощью указателей. Я использую компилятор Visual C ++ 2008 Express.


#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <fstream>
#include <stdio.h>
using namespace std;
// point object
class GLintPoint{
public:
    GLint x,y;
    GLintPoint(){x=0;y=0;}
    GLintPoint(GLint X,GLint Y){x=X;y=Y;}
};
// pass name of the file followed by points to return
void readPolyLineFile(char * filename, GLintPoint ** polylines, GLint *polyCount)
{
    fstream inStream;
    inStream.open(filename, ios::in);
    if(inStream.fail()) return;
    // number of arrays, size of each array,, values of each point
    GLint numpolys, numLines, x, y;
    inStream >> numpolys;
    polylines = new GLintPoint*[numpolys];
    polyCount = new GLint[numpolys];

    for(int j=0;j < numpolys; j++)
    {
        inStream >> numLines;
        polyCount[j] = numLines;
        polylines[j] = new GLintPoint[numLines];

        for(int i=0;i<numLines;i++)
        {
            inStream >> x >> y;
            polylines[j][i].x = x;
            polylines[j][i].y = y;
        }
    }
    inStream.close();
    return;
}

polylines - массив для хранения точечных массивов, который представляет собой данные, которые я хочу. polyCount - размер каждого отдельного массива в полилиниях.

До сих пор, когда я запускаю эту функцию, она запускается, как и ожидалось, но когда она возвращается к строке, из которой я ее вызвал, pointersE был установлен в null, а массивы предположительно удаляются. Почему моя функция удаляет эти массивы и как я могу изменить это поведение, чтобы поддерживать динамический массив при возврате? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 15 февраля 2012

Поскольку вы используете C ++, вы можете либо передать аргументы как ссылки, либо добавить другое перенаправление указателя.

Передача в качестве ссылки:

void readPolyLineFile(char * filename, GLintPoint ** &polylines, GLint *&polyCount)

Затем вы можете использовать переменные "как есть".

Другое решение является более «чистым» C-решением и добавляет еще одно перенаправление указателя:

void readPolyLineFile(char * filename, GLintPoint ***polylines, GLint **polyCount)

Затем вы должны использовать разыменование указателя при назначении переменных:

*polylines = new GLintPoint*[numpolys];
*polyCount = new GLint[numpolys];

// ...

(*polyCount)[j] = numLines;

// ... etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...