2014-09-29 5 views
0

У меня возникают некоторые проблемы со следующим фрагментом кода. Это функция для копирования содержимого одного многомерного массива в другой. код выглядит следующим образом:Ошибка прототипа многомерного массива в C

#include<stdio.h> 
void copyarray(int ros,int cos,double ard[][cos] ,double arf[][cos]); 
int main(){ 
    int rows,columns; 
    printf("Enter number of rows\n "); 
    scanf("%d",&rows); 
    printf("Enter number of columns\n"); 
    scanf("%d",&columns); 
    double ar[rows][columns]; 
    double ar1[rows][columns]; 
    printf("Enter the elements "); 
    for(int i=0;i<rows;i++){ 
    for(int j=0;j<columns;j++){ 
     scanf("%lf",&ar[i][j]); 
    } 
    } 
    printf("The 2d array is :\n"); 

    for(int i=0;i<rows;i++){ 
    for(int j=0;j<columns;j++){ 
      printf("%lf ",ar[i][j]);   
    } 
    printf("\n"); 
    } 
    copyarray(rows,columns,ar,ar1); 
    return 0; 
} 

void copyarray(int r,int c,double ar[r][c],double arr1[r][c]){ 
    for(int j=0;j<r;j++){ 
    for(int i=0;i<size;i++){ 
     arr1[j][i]=ar[j][i]; 
    } 
    } 
    printf("The new array has the following elements:\n"); 
    for(int j=0;j<r;j++){ 
    for(int i=0;i<size;i++){ 
     printf("%lf ",arr1[j][i]); 
    } 
    printf("\n"); 
    } 
} 

Я получаю следующее сообщение об ошибке:

«использование параметра вне тела функции„Cos“»

Может кто-нибудь помочь мне с этим? Благодаря

ответ

2

Вы

void copyarray(int ros,int cos,double ard[][cos] ,double arf[][cos]); 

Что

type function_name(type arg_name_1, 
        type arg_name_2, 
        type array_name_1[][arg_name_2], 
        type array_name_2[][arg_name_2]); 

До C99, вы не можете использовать аргумент (в данном случае, arg_name_2) внутри объявления функции. Ошибка связана с ее использованием в array_name_2[][arg_name_2] как «вне тела функции».

Однако, как указано в HostileFork, вы можете сделать это, если используете компилятор, который придерживается стандарта C99 (или более позднего).

+0

Обратите внимание, что [C99 допускает использование аргументов в качестве границ массива] (https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html). – HostileFork

+0

Спасибо, отредактируйте ответ. – Almo

+0

Так что я должен просто попробовать скомпилировать его в компиляторе, который поддерживает стандарт C99? –

0

у вас есть двойной ard[][cos], double arf[][cos]

вам нужно double *ard, double *arf

, поскольку язык с никогда не массив передается по значению, передается только по ссылке

вы можете передать структуру по значению, но это другая история

#include <stdio.h> 

void fill(int *a) 
{ 
     int i, j; 
     for (i = 0; i < 10; i++) { 
       for (j = 0; j < 10; j++) { 
         a[i * 10 + j] = i + j; 
       } 
     } 
} 
void print(int *a) 
{ 
     int i, j; 
     for (i = 0; i < 10; i++) { 
       for (j = 0; j < 10; j++) { 
         printf("%2d ", a[i * 10 + j]); 
       } 
       printf("\n"); 
     } 
} 

int main(int argc, char *argv[]) 
{ 
     int arr[10][10]; 
     fill(&arr[0][0]); 
     print(&arr[0][0]); 
     return 0; 
} 

может быть не очень красивым, но становится ясно, что на самом деле делает компилятор er

+0

Нет, что написано в OP правильно, если они используют компилятор, который поддерживает VLA. Ни в коем случае выражение типа T [n] [m] 'decay не будет напечатано' T * '; он будет распадаться на тип 'T (*) [m]'. –

+0

Я добавил ответ –