2013-12-24 3 views
3

Я хотел бы функцию, чтобы вернуть массив или указатель на массив, либо С или С ++, что делает что-то вроде следующего:возвращает массив фиксированного размера в с

double[][] copy(double b[][], int mx, int my, int nx, int ny) 
{ 
    double[nx][ny] a; 
    int i,j; 

    for(i = mx; i<= nx; ++i) 
     for(j = my; j<= ny; ++j) 
       a[i][j] = b[i][j]; 

    return a; 
} 

void main(void){ 

    double A[2][3]; 
    double B[2][3] = {{1,2}{3,4}{5,6}}; 

    A = copy(B,0,0,1,2);   
} 
+0

Возврат 'double *'. –

+2

'main' требуется для возврата' int' в C++ (и должен быть на C). Кроме того, если вы используете C++, используйте 'std :: array'. Вы можете вернуть его без проблем. – chris

+5

Вы не можете возвращать массивы из функции в C, если они не обернуты в структуру. Вот и все. –

ответ

1

Это Правильный метод для возвращения массива из функции выглядит следующим образом:

#define NUM_ROWS (5) 
#define NUM_COLS (3) 

char **createCharArray(void) 
{ 
    char **charArray = malloc(NUM_ROWS * sizeof(*charArray)); 
    for(int row = 0; row < NUM_ROWS; row++) 
     charArray[row] = malloc(NUM_COLS * sizeof(**charArray)); 

    return charArray; 
} 

В этом примере выше функция может быть вызвана следующим образом:

char **newCharArray = createCharArray(); 

newCharArray теперь могут быть использованы:

char ch = 'a'; 

for(int row = 0; row < NUM_ROWS; row++) 
    for(int col = 0; col < NUM_COLS; col++) 
     newCharArray[row][col] = ch++; 

Массив может быть передан в качестве аргумента функционировать аналогично:

void freeCharArray(char **charArr) 
{ 
    for(int row = 0; row < NUM_ROWS; row++) 
     free(charArr[row]); 
    free(charArr); 
} 
+0

В этом выражении charArray [row] = malloc (NUM_ROWS * sizeof (** charArray)); Почему используется NUM_ROWS? –

+0

@KaustavRay Typo. Спасибо, что поймал это. –

1

Вы можете вернуть двойной ** из вашей функции копирования, как это.

double ** copy(double *src, int row, int col) 
    { 
    // first allocate the array with required size 
    double **copiedArr = (double **) malloc(sizeof(double *)*row); 

    for(int i=0;i<row;i++) 
    { 
     // create space for the inner array 
     *(copiedArr+i) = (double *) malloc(sizeof(double)*col); 
     for(int j=0; j<col; j++) 
     { 
     // copy the values from source to destination. 
     *(*(copiedArr+i)+j) = (*(src+i+j)); 
     } 
    } 

    // return the newly allocated array. 
    return copiedArr; 
    } 

звонок этой функции делается как этот.

double src[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
double **dest = copy(&src[0][0],3,3); //here is your new array 

Здесь вы должны присвоить возвращаемое значение copy() для double** не double[][]. Если вы попытаетесь присвоить возвращаемое значение массиву, он будет генерировать ошибку «Несовместимые типы» (detail).

Как память выделена copiedArray на кучу, поэтому вы должны взять на себя ответственность за очистку памяти.

void freemem(double **mem, int row) 
    { 
    for(int i=0;i<row; i++) 
    { 
     free(*(mem+i)); 
    } 
    free(mem); 
    } 

Я также хочу отметить некоторую коррекцию в примере кода:

  • возвращение типа основной должно быть внутр.
  • следует положить оператор возврата в конец основного.
  • вы не можете вернуть выделенное стеком значение, это является причиной аварии в большинстве случаев.
Смежные вопросы