2015-04-17 12 views
5

Tôi muốn foo() không sửa đổi mảng. Vì vậy, tôi tuyên bố mảng trong foo() như constconst array [] [] làm tham số chính thức trong C - mismatch

Nếu tôi biên dịch mã này, trình biên dịch được phàn nàn:

#include <stdio.h> 

void foo(const int arr[5][5]) 
{ 
    int i,j; 
    for(i = 0; i < 5; i++) 
    { 
     for(j = 0; j < 5; j++) 
     {  
      printf("%d\n", arr[i][j]); 
     }  
    } 
} 
int main() 
{ 
    int val = 0; 
    int i,j; 
    int arr[5][5]; 
    for(i = 0; i < 5; i++) 
    { 
     for(j = 0; j < 5; j++) 
     {  
      arr[i][j] = val++; 
     }  
    } 
    foo(arr); 
} 

Cảnh báo là:

tham số
allocate.c: In function 'main': 
allocate.c:26:9: warning: passing argument 1 of 'foo' from incompatible pointer type 
    foo(arr); 
     ^
allocate.c:3:6: note: expected 'const int (*)[5]' but argument is of type 'int (*)[5]' 
void foo(const int arr[5][5]) 
    ^

Còn cách nào khác tôi có thể tuyên bố chính thức như liên tục?

+0

Bạn không muốn 'foo()' có thể ** sửa đổi mảng? Bởi vì foo không sửa đổi mảng, nó chỉ đọc nó. – moffeltje

+3

http://stackoverflow.com/a/28062262/1606345 –

+0

có thể trùng lặp của [Truyền mảng hai chiều đến hàm của tham số không đổi] (http://stackoverflow.com/questions/28062095/pass-a-two- chiều-array-to-a-function-of-hằng số-tham số) – 2501

Trả lời

-1

Tôi giả định rằng bạn không muốn foo() có thể sửa đổi mảng theo sở thích đóng gói.

Như bạn đã biết, trong các mảng C được chuyển vào các hàm bằng cách tham chiếu. Bởi vì điều này, bất kỳ thay đổi nào mà foo() làm cho mảng giá trị sẽ được truyền lại cho biến trong hàm main(). Điều này không quan tâm đến việc đóng gói.

const sẽ không ngăn foo() sửa đổi mảng Từ khóa const của C có nghĩa là nội dung nào đó không thể sửa đổi được. Một con trỏ const không thể sửa đổi địa chỉ mà nó trỏ tới. (Các) giá trị tại địa chỉ đó có thể vẫn được sửa đổi. Trong c, Theo mặc định, bạn không thể chỉ định giá trị con trỏ mới cho tên mảng. Không cần const. Tương tự như một con trỏ const, các giá trị trong mảng này có thể vẫn được sửa đổi. Vấn đề đóng gói không được giải quyết.

Để đóng gói foo() từ hàm main() của bạn, hãy đặt mảng của bạn theo cấu trúc. Các đường dẫn được truyền theo giá trị và do đó foo() sẽ nhận được bản sao dữ liệu. Vì nó có một bản sao, foo() sẽ không thể thay đổi dữ liệu gốc. Các chức năng của bạn được đóng gói.

Solution (mà làm việc!):

#include <stdio.h> 

typedef struct 
{ 
    int arr[5][5]; 
} stct; 

void foo(const stct bar) 
{ 
    int i,j; 
    for(i = 0; i < 5; i++) 
    { 
     for(j = 0; j < 5; j++) 
     {  
      printf("%d\n", bar.arr[i][j]); 
     }  
    } 
} 
int main() 
{ 
    int val = 0; 
    int i,j; 
    stct bar; 
    for(i = 0; i < 5; i++) 
    { 
     for(j = 0; j < 5; j++) 
     {  
      bar.arr[i][j] = val++; 
     }  
    } 
    foo(bar); 
} 

tôi đặt const trong foo() định nghĩa bởi vì bạn hỏi làm thế nào bạn có thể khai báo các tham số hình thức như một hằng số. Nó hoạt động nhưng không cần thiết.

void foo(stct bar) 

Xóa const sẽ không phá vỡ chức năng.

+0

'const int a [] = {1, 2}; lỗi [0] = 3; '->. 'const' trên một mảng hoặc con trỏ có nghĩa là con trỏ tới' const'.Bạn đang nói về một cái gì đó như 'int * const p = & something', trong đó con trỏ là một const, nhưng vị trí được trỏ đến không phải là' const'. lỗi 'a ++;' ->. 'a [0] = 0;' -> ok. –

Các vấn đề liên quan