Не удалось инициализировать массив двойных чисел - PullRequest
0 голосов
/ 11 января 2011

Я делаю несколько вызовов функции, которая инициализирует двумерные массивы двойников.Первые три вызова успешны, но четвертый вызов не удается.Код:

double **scmass;
double **scdv;
double **dvmatches;
double **zpp;

...

scmass = init_d2darr(numrow,numcol);
scdv = init_d2darr(numrow,numcol);
dvmatches = init_d2darr(numrow,numcol);
zpp = init_d2darr(numrow,numcol);

...

double ** init_d2darr(int isize, int jsize) {
int m,n;
printf("in array initialize 1\n");
printf("isize: %i\njsize: %i\n",isize,jsize);
/* how many rows */
double **arr = (double **)malloc(sizeof(double *) * isize);
printf("after row initialization\n");
if (arr == NULL) {
    printf("malloc failed for arr in init_d2darr.\n");
    return NULL;
}
else {
    /* now how many cols */
    for (m=0; m<=isize; m++) {
        arr[m] = (double *)malloc(sizeof(double) * jsize);
        if (arr[m] == NULL) {
            printf("malloc failed for arr[%d] in init_d2darr.\n",m);
            return NULL;
        }
        else {
            /* initialize all to zero */
            for (n=0; n<jsize; n++) {
                arr[m][n] = 0;
            }
        }
    }
}
printf("in array initialize 2\n");
return arr;

Вывод выглядит так:

in array initialize 1
isize: 20
jsize: 21
after row initialization
in array initialize 2
in array initialize 1
isize: 20
jsize: 21
after row initialization
in array initialize 2
in array initialize 1
isize: 20
jsize: 21

На самом деле программа полностью проходит в режиме отладки, однако, когда я делаю исполняемый файл релиза и пытаюсь его запустить, программа вылетает, и я получаю сообщение об ошибке «Проблема вызвала некорректную работу программы. Пожалуйста, закройте программу."Я на Windows Vista с Visual C ++ 2008 Express Edition.Кто-нибудь может дать мне какой-нибудь совет?Спасибо!

Jade

Редактировать: объявление функции (в заголовочном файле):

double ** init_d2darr(int isize, int jsize);

Ответы [ 2 ]

0 голосов
/ 11 января 2011

Во внешнем цикле for:

for (m=0; m <= isize; m++) 

это должно быть:

for (m=0; m < isize; m++) 
0 голосов
/ 11 января 2011
class double_array {
    double* arr;
    int arrsize;
public:
    double_array(int newsize) {
        arr = new double[newsize];
        arrsize = newsize;
        for(int i = 0; i < arrsize; i++)
            arr[i] = 0;
    }
    double_array(const double_array& other) {
        arr = new double[arrsize = other.arrsize];
        for(int i = 0; i < arrsize; i++)
            arr[i] = other.arr[i];
    }
    double& operator[](int index) {
#ifdef _DEBUG
        if (index >= arrsize)
            throw std::runtime_error("Attempted to access array out of bounds!");
#endif
        return arr[index];
    }
    const double& operator[](int index) const {
#ifdef _DEBUG
        if (index >= arrsize)
            throw std::runtime_error("Attempted to access array out of bounds!");
#endif
        return arr[index];
    }
    int size() {
        return arrsize;
    }
    ~double_array() {
        delete[] arr;
    }
};
std::vector<double_array> scmass(numrows, numcols);
std::vector<double_array> scdv(numrows, numcols);
std::vector<double_array> dvmatches(numrows, numcols);
std::vector<double_array> zpp(numrows, numcols);

Легко.

...