Как я могу объявить динамически распределенный массив глобальным - PullRequest
0 голосов
/ 08 апреля 2011

как я могу объявить динамически размещенный массив глобальным, чтобы массив не нужно было инициализировать в любой другой функции ???

ushort  ***array_3D;
ushort **array_2D; 
extern int nexp;
int xarr,yarr; 
/***********intialization************/
void initialize()
{
    fflush(stdout);
    printf("Hi");
    int ii,jj,kk;
    /*************** 2D array *********************/    
    // Allocate "main" array
    //
    array_2D = new ushort*[xarr];

    // Allocate each member of the "main" array
    //
    for (ii = 0; ii < xarr; ii++)
        array_2D[ii] = new ushort[yarr];
    /***********************************************/
    /************** 3D array ***********************/
    // Allocate "main" array
    //
    array_3D = new ushort**[nexp];

    // Allocate each member of the "main" array
    //
    for (ii = 0; ii < nexp; ii++)
        array_3D[ii]= array_2D;

    /***********************************************/
    return;
}

/**************some other function***************/
void foo
{
    int ii,kk,jj;
    int src_buffer[200];
    status = 0;         /* initialize status before calling fitsio routines */
    for (jj = 0; jj < naxes[1]; jj++)
        for (ii = 0; ii < naxes[0]; ii++)
        {
            src_buffer[i]=int(rand());
            array_2D[jj][ii]=int(src_buffer[n]);
            array_3D[kk][jj][ii]= int(src_buffer[n]);
        }
}

когда я компилирую вышеупомянутую программу, она компилируется без каких-либо проблем .... но когда я запускаю программу, я получаю ошибку сегментации, когда я вызываю "foo". Помощь нужна срочно. заранее спасибо.

1 Ответ

0 голосов
/ 08 апреля 2011

Вы хотели, чтобы каждая запись в array_3D указывала на один и тот же 2D-массив? Я думаю, нет. (Но это не может быть причиной вашей ошибки.)

Ваш код не указывает, как xarr, yarr, nexp и naxes[...] получают их значения. Если они не совпадают правильно - например, naxes[0] больше yarr - тогда foo будет пытаться получить доступ к вещам после окончания того, что вы выделили.

Функция foo использует i в качестве индекса для src_buffer, но i не определено. Если у вас есть глобальная переменная с именем i, измените ее прямо сейчас . Если он должен сказать ii, то, опять же, если naxes[0] больше 200, тогда вы напишите после конца src_buffer.

Функция foo использует n в качестве индекса для src_buffer, но n не определено. Если у вас есть глобальная переменная с именем n, то снова измените ее. Иначе, что значит n? 1031 *

...