2011-12-23 76 views
28

Xin chào Tôi là người mới đến C++ Tôi đang cố trả về mảng 2d từ một hàm. Nó là một cái gì đó như thế nàyTrả về mảng 2d từ một hàm

int **MakeGridOfCounts(int Grid[][6]) 
{ 
    int cGrid[6][6] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }}; 

    return cGrid; 
} 
+0

Và câu hỏi của bạn là? Đây có phải là C hoặc C++ không? – Mat

+3

Nếu bạn là một newbie và đang cố gắng trả lại một mảng 2D, bạn có thể cần [tài liệu học tập tốt hơn] (http://stackoverflow.com/q/388242/46642). Mảng không thân thiện với người mới bắt đầu và thậm chí ít hơn khi chúng đa chiều. –

+0

Đây là [phiên bản C của cùng một câu hỏi] (http://stackoverflow.com/questions/8617889/return-a-2d-array-from-a-function). –

Trả lời

4

Những gì bạn đang (cố gắng làm)/làm trong đoạn mã của bạn là để trở về một biến địa phương từ chức năng, mà không phải là ở tất cả các đề nghị - cũng không phải là cho phép theo Tiêu chuẩn.

Nếu bạn muốn tạo một int[6][6] từ chức năng của bạn, bạn sẽ có thể sở để phân bổ bộ nhớ cho nó trên free-store (tức. Sử dụng mới T/malloc hoặc chức năng tương tự), hoặc vượt qua trong một đã được cấp phát bộ nhớ cho MakeGridOfCounts.

+0

ok vì vậy bạn có nghĩa là trong C phân bổ bộ nhớ và trả lại nó? – user1047092

+0

@ user1047092 Có, đừng quên để 'giải phóng' bộ nhớ được cấp phát khi bạn làm xong nó, hoặc' xóa' (nếu bạn đang viết C++ làm tiêu đề của câu hỏi này). –

+1

Không, nếu bạn đang sử dụng C++ không 'xóa' bất cứ điều gì. Không bao giờ. Luôn sử dụng lớp quản lý tài nguyên. – Puppy

3

Mã đó sẽ không hoạt động, và nó sẽ không giúp bạn học đúng C++ nếu chúng ta sửa nó. Sẽ tốt hơn nếu bạn làm điều gì đó khác biệt. Các mảng thô (đặc biệt là các mảng đa chiều) rất khó để truyền chính xác đến và đi từ các hàm. Tôi nghĩ bạn sẽ tốt hơn khi bắt đầu với một đối tượng mà đại diện cho một mảng nhưng có thể được sao chép một cách an toàn. Tra cứu tài liệu cho std::vector.

Trong mã của bạn, bạn có thể sử dụng vector<vector<int> > hoặc bạn có thể mô phỏng mảng 2-D có 36 thành phần vector<int>.

28

Mã này trả về mảng 2d.

#include <cstdio> 

    // Returns a pointer to a newly created 2d array the array2D has size [height x width] 

    int** create2DArray(unsigned height, unsigned width) 
    { 
     int** array2D = 0; 
     array2D = new int*[height]; 

     for (int h = 0; h < height; h++) 
     { 
      array2D[h] = new int[width]; 

      for (int w = 0; w < width; w++) 
      { 
        // fill in some initial values 
        // (filling in zeros would be more logic, but this is just for the example) 
        array2D[h][w] = w + width * h; 
      } 
     } 

     return array2D; 
    } 

    int main() 
    { 
     printf("Creating a 2D array2D\n"); 
     printf("\n"); 

     int height = 15; 
     int width = 10; 
     int** my2DArray = create2DArray(height, width); 
     printf("Array sized [%i,%i] created.\n\n", height, width); 

     // print contents of the array2D 
     printf("Array contents: \n"); 

     for (int h = 0; h < height; h++) 
     { 
      for (int w = 0; w < width; w++) 
      { 
        printf("%i,", my2DArray[h][w]); 
      } 
      printf("\n"); 
     } 

      // important: clean up memory 
      printf("\n"); 
      printf("Cleaning up memory...\n"); 
      for ( h = 0; h < height; h++) 
      { 
      delete [] my2DArray[h]; 
      } 
      delete [] my2DArray; 
      my2DArray = 0; 
      printf("Ready.\n"); 

     return 0; 
    } 
0

Bất kỳ thay đổi nào bạn thực hiện sẽ vẫn tồn tại. Không cần phải trả lại bất kỳ thứ gì. Bạn có thể chuyển mảng 2d và thay đổi bất cứ khi nào bạn muốn.

void MakeGridOfCounts(int Grid[][6]) 
    { 
     cGrid[6][6] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }}; 

    } 

hoặc

void MakeGridOfCounts(int Grid[][6],int answerArray[][6]) 
    { 
    ....//do the changes in the array as you like they will reflect in main... 
    } 
-1
int** create2DArray(unsigned height, unsigned width) 
{ 
    int** array2D = 0; 
    array2D = new int*[height]; 

    for (int h = 0; h < height; h++) 
    { 
      array2D[h] = new int[width]; 

      for (int w = 0; w < width; w++) 
      { 
       // fill in some initial values 
       // (filling in zeros would be more logic, but this is just for the example) 
       array2D[h][w] = w + width * h; 
      } 
    } 

    return array2D; 
} 

int main() 
{ 

    printf("Creating a 2D array2D\n"); 
    printf("\n"); 

    int height = 15; 
    int width = 10; 
    int** my2DArray = create2DArray(height, width); 
    printf("Array sized [%i,%i] created.\n\n", height, width); 

    // print contents of the array2D 
    printf("Array contents: \n"); 

    for (int h = 0; h < height; h++) 
    { 
     for (int w = 0; w < width; w++) 
     { 
       printf("%i,", my2DArray[h][w]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

Điều này làm việc tốt cho tôi !!! – user3785412

+2

Bạn trả lời có hai nhược điểm lớn: 1.Bạn chỉ đưa ra mã mà không có lời giải thích, và 2. định dạng mã của bạn đã sai để đánh dấu không nhận ra nó như là một khối mã. Để định dạng đúng, bạn cần bốn dấu cách cho mỗi dòng mã. Lưu ý rằng bạn có thể thêm bốn dấu cách này bằng cách chọn mã của bạn và sau đó nhấp vào nút mã hóa trong trình chỉnh sửa (phần có dấu ngoặc nhọn '{}'). Tôi đã sửa nó cho bạn. Lời giải thích còn thiếu là của bạn. Ps: Tôi không downvote. – cmaster

+0

Câu trả lời này không phải là bản sao/dán của Software_Designer dưới đây? – Matt

2

Một lựa chọn tốt hơn để sử dụng con trỏ để trỏ là sử dụng std::vector. Điều đó sẽ chăm sóc các chi tiết về phân bổ bộ nhớ và deallocation.

std::vector<std::vector<int>> create2DArray(unsigned height, unsigned width) 
{ 
    return std::vector<std::vector<int>>(height, std:vector<int>(width, 0)); 
} 
0

trả về một mảng con trỏ trỏ tới phần tử bắt đầu của tất cả các hàng là cách duy nhất để trả về mảng 2d.

+2

thêm mô tả khác cho nó, tại sao cách duy nhất của nó, tại sao không phải là người khác – piyushj

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