2012-04-02 68 views
5

Tôi đang cố chuyển một mảng (2d) đến một hàm làm tham số. Tôi có một mã số như sau:Làm thế nào để truyền một mảng hai chiều đến một hàm trong C++

int main() 
{ 
    float T[100][100]; 
    void set_T(float T[][]); 
} 


void set_T(float T1[][]) 
{ 


    for (int i =0 ; i<90;i++) 
    { 
     for(int j =0 ;j <90;j++) 
     { 
      T1[i][j] = 3; 
     } 
    } 

} 

Tôi không chắc chắn làm thế nào để vượt qua mảng tới một hàm ... Tôi nhận được rất nhiều lỗi. Ai có thể giúp tôi không.

+0

có thể trùng lặp của [truyền mảng 2D đến hàm] (http://stackoverflow.com/questions/8767166/passing-2d-array-to-function) – legends2k

Trả lời

-3

Chỉ cần gọi nó như thế này:

int main() 
{ 
    float T[100][100]; 
    set_T(T); 
} 

Và như @suddnely_me nói, loại T1 trong phần khai báo hàm cần phải float**.

+2

'float [] []' và 'float **' là khác nhau. –

+0

@Jesse là đúng. Mảng 2D kiểu C không được triển khai dưới dạng mảng * con trỏ * thành mảng. Đó là một mảng các mảng, tức là hàng đầu tiên của 100 phần tử theo sau là hàng thứ hai gồm 100 phần tử, v.v. Vì vậy, để truy cập đúng mảng 2D bằng cú pháp C, hàm được gọi cần tất cả nhưng một thứ nguyên được chỉ định. –

5
void set_T(float (&T)[100][100]); 
8

Có hai vấn đề ở đây:

  • C không hỗ trợ mảng 2D, chỉ có mảng của mảng hay mảng các con trỏ đến mảng, không ai trong số đó là khá điều tương tự như một mảng 2D
  • C không cho phép truyền các mảng thành các đối số, chỉ con trỏ vào các mảng (generaly, bạn sử dụng con trỏ tới phần tử thứ 0 của mảng, vì đó là tên của mảng kết thúc bằng cách lập chỉ mục như vậy. truy cập mảng)

Vì vậy, vì vấn đề đầu tiên, bạn phải quyết định làm thế nào bạn sẽ đại diện cho một mảng 2D - hoặc là một mảng của mảng, hoặc một mảng của con trỏ đến mảng. Nếu bạn đi theo con đường đầu tiên, mã của bạn sẽ trông giống như:

void set_T(float (*T1)[100]) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float T[100][100]; 
    set_T(T); 
} 

Ở đây, bạn đã tuyên bố T là một mảng của 100 mảng 100 phao, và set_T mất một con trỏ đến mảng 100 nổi như đối số của nó. Bạn chuyển 'T' trực tiếp tới set_T, vì ngôn ngữ xử lý các tên mảng như con trỏ tới phần tử thứ 0 của chúng.

Nếu thay vào đó bạn muốn sử dụng một mảng của con trỏ đến mảng, bạn kết thúc với một cái gì đó như:

void set_T(float **T1) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float *T[100]; 
    float space[100*100]; 
    for (int i = 0; i < 100; i++) 
     T[i] = space + i*100; 
    set_T(T); 
} 

Những bất lợi ở đây là bạn cần phải phân bổ không gian cho tất cả các mảng thứ hai cấp và khởi tạo thủ công tất cả các con trỏ mức đầu tiên để trỏ vào chúng. Sự tăng áp là kích thước của các mảng mức thứ hai không phải là một phần của kiểu đối số được truyền cho set_T, vì vậy bạn có thể dễ dàng xử lý các mảng có kích thước biến hơn. Tất nhiên, nếu bạn đang sử dụng C++ chứ không phải C, bạn không nên sử dụng các mảng C - bạn nên sử dụng std::vector hoặc std::array thay vào đó - cả hai đều chỉ chia sẻ vấn đề 1D mảng C, do đó, bạn cần một vec tơ vectơ hoặc một mảng các mảng (hoặc có thể hiểu được một vectơ của mảng hoặc một mảng vec-tơ)

+0

Tôi cảm thấy câu trả lời của bạn có thể liệt kê một số lựa chọn thay thế tốt hơn cho 'float (*) [100]' hoặc 'float **' để thực sự hoàn thành. –

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