Return array in function c++

mọi người cho mình hỏi làm thế nào để trả về array trong 1 function nhỉ :frowning: mình cảm ơn

Trả về cái pointer là được.

2 Likes

Array gồm pointer và size, trả về sẽ khó hơn là trả về pointer không.
Tốt nhất là tận dùng kiểu dữ liệu std::vector

4 Likes

Nếu muốn dùng array thì 1 là cấp phát động:

#include <iostream>
#include <cstdlib>

int* someCal(int n)
{
  int* wantData = new int[n];
  wantData[1] = 1;
  
  return wantData;
}


int main()
{
    int* data = someCal(3);
    std::cout << data[1] << std::endl;
    delete[] data;
}

2 là xài hàm trung gian:

#include <iostream>
#include <cstdlib>

bool someCal(int outputData[])
{
  outputData[1] = 1;
  
  return true;
}


int main()
{
    int* wantData = new int[3];
    wantData[1] = 0;
    someCal(wantData);
    std::cout << wantData[1] << std::endl;
}

3 là smart pointer

#include <iostream>
#include <cstdlib>
#include <memory>

std::shared_ptr<int[]> someCal(int n)
{
  auto wantData = std::make_shared<int[]>(n);
  wantData[1] = 1;
  
  return wantData;
}


int main()
{
    auto data = someCal(3);
    std::cout << data[1] << std::endl;
}
3 Likes
  • Nếu số lượng phần tử trả về biết trước, hay lúc nào cũng là 1 số lượng cố định thì xài std::array

    #include <array>
    
    std::array<int, 4> return4Integers() {
        std::array<int, 4> result;
        // làm gì đó với mảng 4 phần tử này
        return result;
    }
    
  • Nếu số lượng phần tử trả về ko rõ, ví dụ có thể trả về từ 10-1000 phần tử, hay ví dụ trả về mảng các số nguyên tố bé hơn 1000, thì xài std::vector

    #include <vector>
    
    std::vector<int> returnNIntegers(int n) {
        std::vector<int> result(n); // mảng n số nguyên
        // làm gì đó với mảng này
        return result;
    }
    
    std::vector<int> primesLessThan(int n) {
        std::vector<int> result;
        for (int i = 2; i < n; ++i) if (isPrime(i)) result.push_back(i);
        return result;
    }
    
4 Likes

Về cơ bản, chúng ta không thể return được array.
Thế nên cách để lấy một array như một kiểu trả về từ hàm thì có thể return về 1 con trỏ trỏ tới phần từ đầu tiên trong array đó.

để array vào 1 struct là return nó được thôi à, ko có gì bí hiểm @_@ Ông C bị khùng nên tự decay array thành con trỏ. Theo ý của mình ko truyền mảng như biến bình thường được vì nó tự động biến thành con trỏ là design cực kì hạn hẹp của C.

https://stackoverflow.com/a/38857777/ do lý do lịch sử, thừa kế từ B nên mới ra cái array decay dở dở ương ương này… Trong B mảng được implement nhờ 1 con trỏ, nên C cũng implement array như vậy. Sau đó struct được thêm vào C sau array, mảng trong struct ko cần con trỏ này nữa mà chứa được mảng thật luôn. Từ đó array cũng ko cần con trỏ như B nữa, nhưng để backward compatibility thì array vẫn bị decay thành con trỏ để thỏa mãn cụ B…

4 Likes

C++ vẫn còn mấy cái hàm của C thây :gach:

2 Likes

ai biểu đòi backward compatibility với C :sneezing_face:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?