2013-07-10 47 views
6

tôi có chức năng như thế này:C++ mảng khởi động với tuyên bố

void findScarf1(bool ** matrix, int m, int n, int radius, int connectivity); 

và trong chính chức năng tôi có thể tạo mảng động 2ngày để vượt qua trong chức năng này

bool matrix[6][7] = { 
    {0, 0, 1, 1, 1, 0, 0}, 
    {0, 0, 1, 1, 1, 0, 0}, 
    {0, 0, 1, 1, 1, 0, 0}, 
    {0, 0, 1, 1, 1, 0, 0}, 
    {0, 0, 1, 1, 1, 0, 0}, 
    {0, 0, 1, 1, 1, 0, 0} 
}; 

Vấn đề là:

findScarf1(matrix, 6, 7, 3, 4); 

gây ra lỗi C2664: 'findScarf1': không thể chuyển đổi thông số 1 từ 'bool [6] [7]' thành 'bool **'

Làm thế nào để khởi tạo mảng gọn (đồng thời với tuyên bố)?

p.s. xin lỗi nếu đó là câu hỏi trùng lặp nhưng tôi đã dành 1,5 giờ tìm nó ra

+1

Mảng không gợi ý. Bạn đang truyền một con trỏ (sau khi phân rã) đến một mảng nơi mà một con trỏ trỏ đến một con trỏ được mong đợi. – chris

+2

http://stackoverflow.com/a/8767247/2494803 – bennofs

+0

thử: 'bool matrix [6] [7]', và 'bool matrix [] [7]', và 'bool (* matrix) [7]' –

Trả lời

2

Về mặt kỹ thuật, một mảng 2D là một mảng của mảng 1D. Vì vậy, nó không thể chuyển đổi thành con trỏ thành con trỏ. Tuy nhiên, nó có thể chuyển đổi thành con trỏ thành mảng.

Vì vậy, điều này sẽ làm việc:

void findScarf1(bool (*matrix)[7], int m, int n, int radius, int connectivity); 

đây bool (*matrix)[7] khai báo một con trỏ để mảng của 7 bool.

Hy vọng điều đó sẽ hữu ích.

+1

Bạn phải thêm rằng trong hàm 'findScaf1()' anh ta có thể truy cập các phần tử '(* ma trận) [i] [j]' và 'ma trận [i] [j]' sẽ sai, tôi chắc chắn nếu không OP sẽ phạm sai lầm . –

+1

@GrijeshChauhan, Làm thế nào nó có thể sai? Đó là những gì nó phân rã khi lập chỉ mục bình thường. – chris

+2

@GrijeshChauhan: 'ma trận [i] [j]' là cú pháp hoàn toàn chính xác. Trong thực tế, '(* matrix) [i] [j]' là WRONG !!! – Nawaz

1

Bạn có thể xác định các chức năng như:

void findScarf1(bool * matrix, int m, int n, int radius, int connectivity); 

Hoặc

void findScarf1(bool matrix[][7], int m, int n, int radius, int connectivity); 

Không có vấn đề bao nhiêu kích thước một mảng có, nó chỉ là một khối bộ nhớ tuyến tính.

Khi bạn sử dụng cách đầu tiên, bạn có thể cần phải làm một diễn viên khi gọi hàm này:

findScarf1((bool *)marix, 6, 7, 3, 4); 
3

Nếu bạn xem mảng của bạn được đặt trong bộ nhớ như thế nào, và so sánh nó như thế nào "ma trận" con trỏ được đặt ra, bạn sẽ hiểu tại sao bạn không thể chuyển ma trận dưới dạng con trỏ tới con trỏ .

Bạn ma trận là như thế này:

 
[ matrix[0][0] | matrix[0][1] | ... | matrix[0][6] | matrix[1][0] | matrix[1][1] | ... ] 

Một ma trận trong con trỏ-to-con trỏ là như thế này:

 
[ matrix[0] | matrix[1] | ... ] 
    |   | 
    |   v 
    |   [ matrix[1][0] | matrix[1][1] | ... ] 
    v 
    [ matrix[0][0] | matrix[0][1] | ... ] 

Bạn có thể giải quyết việc này bằng cách thay đổi các tham số của hàm:

bool (*matrix)[7] 

Điều đó làm cho đối số matrix con trỏ đến một mảng, sẽ hoạt động.


Và bằng cách này, các matrix biến mà bạn có là không động, nó tuyên bố đầy đủ và khởi tạo bởi trình biên dịch, không có gì động về nó.

1

dụ sau tôi có thể hữu ích cho bạn:

#include<stdio.h> 
void f(int (*m)[7]){ // As Nawaz answred 
printf("%d\n", m[3][3]); 

} 
void _f(int m[6][7]){ // As I commented to your question 
printf("%d\n", m[3][3]); 

} 
void _f_(int m[][7]){// Second form of Nawaz's answe 
printf("%d\n", m[3][3]); 

} 
void f_(int (*m)[6][7]){// Pointer of 2D array 
printf("%d\n", (*m)[3][3]); 
} 

int main(){ 

    int matrix[6][7] = { 
    {0, 0, 1, 1, 1, 0, 0}, 
    {0, 0, 1, 3, 1, 0, 0}, 
    {0, 0, 1, 4, 1, 0, 0}, 
    {0, 0, 1, 5, 1, 0, 0}, 
    {0, 0, 1, 6, 1, 0, 0}, 
    {0, 0, 1, 7, 1, 0, 0} 
    }; 
    f(matrix); 
    _f(matrix); 
    _f_(matrix);  
    f_(&matrix); 
    return 1; 
}  

câu hỏi không tanged c, nhưng tôi biên soạn với gcc (Tôi đã không được cài đặt g ++).

~$ gcc -Wall -pedantic 2d.c 
~$ ./a.out 
5 
5 
5 
5 

tôi đã không có ý định gửi một câu trả lời, nhưng vì tôi nhận xét sai lầm khi Nawaz câu trả lời như vậy trong một thử nghiệm tôi viết mã này.

Ở đây người ta có thể tìm thấy nó làm việc tại codepacde