Возвращая нулевое значение при импорте файла mat в код на C++

Я новичок в C++ и пытаюсь импортировать файл mat в свою программу на C++. Существует отдельный класс для получения всех свойств матрицы в файле mat. Ниже приведен мой заголовочный файл readmat.h

#ifndef READMAT_H
#define READMAT_H
#include "mat.h"
#include "matrix.h"
#include "mex.h"



class readmat
{
private:
const size_t *dimarray;
const char **dir;
MATFile *pmat;
int ndir;
mxArray *pa;
const char *file;
int minute;
int second;
const char *name;
double *pointer;
bool isdouble;
void getmxpointer();

public:

//with default value
readmat(const char *f);
//  get number of dimensions
int getnumbrofdimensions();
// get pointer to array
double* getarraypointer();
// get pointer to each dimension size
const size_t* dimensionpointer();
//number of elements
int numberofelements();


};

#endif

Это мой readmat.cpp.

#include "readmat.h"
#include <iostream>
#include "mat.h"
#include "matrix.h"
#include "mex.h"
using namespace std;

// set the file name
readmat::readmat(const char *f)
{
    file = f;
}

void readmat::getmxpointer()
{
    pmat = matOpen(file, "r");
    if (pmat == NULL) {
        cout << "Error opening file" << endl;
    }
    else
    {
        dir = (const char **)matGetDir(pmat, &ndir);
        if (dir == NULL) {
            printf("Error reading directory of file %s\n", file);

        }
        else if (ndir>1)
       {
           cout << "The number of variables are larger than 1" << endl;
       }
        else
        {
            mxFree(dir);
            matClose(pmat);
            pmat = matOpen(file, "r");
            for (int q = 0; q < 1; q++)
           {
                pa = matGetNextVariableInfo(pmat, &name);

            }
            matClose(pmat);
        }

    }


}

int readmat::getnumbrofdimensions()
{
    getmxpointer();
    return mxGetNumberOfDimensions(pa);
}

double * readmat::getarraypointer()
{
    getmxpointer();
    pointer = mxGetPr(pa);
    return pointer;

}

 const size_t*  readmat::dimensionpointer()
{
    getmxpointer();
    dimarray =  mxGetDimensions(pa);
    return dimarray;
}

 int readmat::numberofelements()
 {
     getmxpointer();
     return mxGetNumberOfElements(pa);
 }

Следующее - мой main.cpp

#include "mat.h"
#include <iostream>
#include <stdio.h>
#include <string.h> /* For strcmp() */
#include <stdlib.h> /* For EXIT_FAILURE, EXIT_SUCCESS */
#include <vector> /* For STL */
#include "readmat.h"


using namespace std;

int main()
{
    int i;
    int m;
    int elements;
    int numberofdimension;
    double *datapoint;
    const char *file = "pqfile.mat";
    const size_t* dimepointer;

    readmat thismat(file);
    numberofdimension = thismat.getnumbrofdimensions();
    dimepointer = thismat.dimensionpointer();
    cout << "The dimensions are  ";
    for (m = 0; m < numberofdimension; m++)
    {
        cout << *(dimepointer + m);
        cout << "  ";
    }
    cout << endl;
    cout << "This is the number of dimensions  ";
    cout << numberofdimension << endl;
    datapoint = thismat.getarraypointer();
    elements = thismat.numberofelements();
    cout << "The array elements ";
    cout << elements;
    cout << endl;
    cout << thismat.pointer;
   /*for (n = 0; n < elements; n++)
    {
   cout << *(arraypint + m);
   cout << " ";
    }*/

    cin >> i;
    return 0;

}

Но здесь, кроме функции getarraypointer(), другие работают нормально. getarraypointer() возвращает нулевое значение, и в окне просмотра указатель datapoint, которому назначен возврат из getarraypointer(), не может прочитать сообщение памяти. Когда я запускаю тот же сегмент кода в основном, он работает без проблем. Вот этот код.

MATFile *pmat;
int i;
int   ndir;
const char **dir;
const char *file = "pqfile.mat";
mxArray *pa;
const char *name;
double *in1pr;



pmat = matOpen(file, "r");
if (pmat == NULL) {
    printf("Error reopening file %s\n", file);
    return(1);
}

//dir = (const char **)matGetDir(pmat, &ndir);
for (i = 0; i<1; i++) {
    pa = matGetNextVariable(pmat, &name);
    }
matClose(pmat);
in1pr = mxGetPr(pa);
cout << "Value of variable: ";
cout << *(in1pr + 5) << endl;
cin >> i;
return 0;

0 ответов

Другие вопросы по тегам