2009-04-06 72 views
10

i ve tạo ra hai mảng chiều bên trong một hàm, tôi muốn quay trở lại mảng đó, và vượt qua nó ở đâu đó để chức năng khác ..cách trả về mảng c chiều hai chiều C++?

char *createBoard(){ 
    char board[16][10]; 
    int j =0;int i = 0; 
    for(i=0; i<16;i++){ 
     for(j=0;j<10;j++){ 
       board[i][j]=(char)201; 
     } 
    } 
    return board; 
} 

nhưng điều này giữ cho tôi lỗi

+0

Bạn có thể cụ thể hơn về lỗi này không? –

+1

Bạn nên sử dụng unsigned char thay vì vì 201 không nằm trong phạm vi char. –

+2

Ngoài ra, bạn đang trả về địa chỉ của biến cục bộ. Nếu bạn cố truy cập nó, chương trình của bạn sẽ bị lỗi. – Naveen

Trả lời

11

Hãy xem bạn đang làm gì có trả về một con trỏ tới một đối tượng (mảng có tên là board) được tạo trên ngăn xếp. Mảng này bị phá hủy khi nó nằm ngoài phạm vi để con trỏ không còn trỏ đến bất kỳ đối tượng hợp lệ nào (một con trỏ lơ lửng).

Bạn cần đảm bảo rằng mảng được cấp phát trên heap thay vì sử dụng new. Phương pháp được thánh hóa để tạo mảng được phân bổ động trong C++ hiện đại là sử dụng thứ gì đó giống như lớp std::vector, mặc dù điều đó phức tạp hơn ở đây vì bạn đang cố gắng tạo một mảng 2D.

char **createBoard() 
{ 
    char **board=new char*[16]; 
    for (int i=0; i<16; i++) 
    { 
     board[i] = new char[10]; 
     for (int j=0; j<10; j++) 
     board[i][j]=(char)201; 
    } 

    return board; 
} 

void freeBoard(char **board) 
{ 
    for (int i=0; i<16; i++) 
     delete [] board[i]; 
    delete [] board; 
} 
+0

nó cho tôi lỗi trên dòng thứ hai, nó nói " lỗi cú pháp: thiếu ';' trước khi '[' " – r4ccoon

+0

xóa khung xung quanh dòng thứ hai và nó hoạt động. char ** board = char mới * [maxX]; ít nhất nó không mang lại cho tôi lỗi trình biên dịch và lỗi gửi đi – r4ccoon

+0

Vâng xin lỗi về điều đó, tôi đã không ngồi tại một trình biên dịch và tôi đã phải đoán theo cú pháp cho dòng đó. –

0

Bạn nên trả lại char** thay của char*

+0

cố gắng thực hiện việc này, đã thay đổi định nghĩa lưới của tôi thành char * board [16] [10]; và gán cho * board [i] [j] = (char) 201; vẫn tạo ra lỗi biên dịch – r4ccoon

2

Cách tiếp cận này sẽ không hoạt động. Nếu bạn trả về một con trỏ đến một biến cục bộ, bạn sẽ chạy vào hành vi không xác định. Thay vào đó, phân bổ mảng trên heap với mới và sao chép dữ liệu vào mảng theo cách thủ công lập chỉ mục đó.

0

Câu trả lời đơn giản cho câu hỏi của bạn là char **.

Có nói rằng, KHÔNG LÀM VIỆC! Biến "board" của bạn sẽ không tồn tại bên ngoài createBoard().

Sử dụng boost::multi_array và chuyển nó làm tham chiếu đến createBoard() hoặc trả lại trực tiếp (nhưng nếu bạn làm như vậy, nó sẽ được sao chép).

+0

xin lỗi, không thể sử dụng khung tăng cường. nó giả sử sử dụng cơ bản C++ – r4ccoon

2

Tôi thực sự khuyên bạn nên sử dụng các vector STL <> hoặc tăng/multi_array cho việc này.

Nếu bạn phải sử dụng mảng, thì tôi khuyên bạn nên sử dụng typedef để xác định mảng.

typedef char[16][10] TBoard; 

Bạn cũng có thể trở lại

char** 

... nhưng sau đó bạn sẽ cần phải định kiểu nó vào kích thước chính xác để chỉ số nó một cách chính xác. C++ không hỗ trợ mảng nhiều mảng động.

Cũng như những người khác đã gợi ý bạn không thể trở về một đối tượng trên stack (tức là biến cục bộ)

+0

không thể sử dụng khung tăng cường, và họ havent dạy tôi về vector .. vì vậy tôi không thể sử dụng nó – r4ccoon

+0

Sau đó đi với typedef (nếu bạn có một kích thước bảng tĩnh). –

0

Bạn không được trả lại con trỏ đến một chức năng biến địa phương vì không gian này được ghi đè càng sớm càng chức năng trả về.

Bộ nhớ được liên kết với bảng nằm trên ngăn xếp của hàm.

11

Cách tiếp cận tốt nhất là tạo ra một lớp đồng quản trị và thực hiện các hoạt động ctreateBoard constructor của nó:

class Board { 
    private: 
    char mSquares[16][10]; 

    public: 
    Board() { 
     for(int i=0; i<16;i++){ 
     for(int j=0;j<10;j++){ 
       mSquares[i][j]=201; 
     }  
    } 

    // suitable member functions here 
}; 

Để biết thông tin về cách sử dụng một lớp học như vậy, không có thay thế cho việc đọc một cuốn sách hay. Tôi đặc biệt khuyên bạn nên Accelerated C++ bởi Andrew Koenig và Barbra Moo.

+0

làm cách nào để chuyển nó sang chức năng khác trên lớp khác? – r4ccoon

+0

Một cách đơn giản là đánh dấu mSquares là công khai. Và chuyển các tham chiếu đến đối tượng Board thành các hàm. –

+4

Một cách đơn giản nhưng không tốt. –

1

Không trả lại con trỏ về biến cục bộ, như được đề cập khác. Nếu tôi bị buộc phải làm những gì bạn muốn đạt được, trước tiên tôi sẽ đi cho std :: vector. Vì bạn chưa học được std :: vector, dưới đây là một cách khác:

void createBoard(char board[16][10]) 
{ 
    int j =0;int i = 0; 
    for(i=0; i<16;i++){ 
     for(j=0;j<10;j++){ 
       board[i][j]=(char)201; 
     }  
    } 
} 
+2

phải là "void createBoard (char (& board) [16] [10]);" (tham chiếu đến mảng) – qwerty

+1

quyền của qwerty: bạn xác định đối số của mình dưới dạng giá trị theo từng giá trị. Vượt qua nó bằng cách tham khảo và tất cả các công trình tốt. – xtofl

+0

Cả hai đều hoạt động trong Visual Studio 2008. Tôi bối rối. Có gì sai với việc triển khai của tôi? Làm thế nào mảng được truyền theo giá trị? – Donotalo

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