01/10/2018, 08:13
Return hai giá trị trong một hàm C/C++
Chào mọi người mình đang làm một chương trình C++
Trong đó mình viết cho nó một cái hàm sẽ trả về hai giá trị
Nhưng mà trong C++ nó lại không dễ trả về hai giá trị bạn nào biết làm không chỉ mình với
Mình có tìm trên mạng thấy nó có ghi là dùng thư viện tuple nhưng mà mình lại ko biết dùng
Bài liên quan
Chào bạn, về vấn đề của bạn thì mình nghĩ kiểu dữ liệu struct là phù hợp nhất
Về cơ bản Struct là một kiểu dữ liệu bao gồm nhiều thành phần có thể thuộc nhiều kiểu dữ liệu khác nhau. Các thành phần được truy nhập thông qua một tên.
Lúc return bạn chỉ cần return tên của struct
Để tìm hiểu rõ hơn bạn có thể đọc qua ở đây:
https://www.stdio.vn/articles/read/166/struct-va-union
Mình nghĩ nên truyền gửi vào 2 parameters, xong rồi gán giá trị cho 2 parameters đó là được. Gọi là truyền tham chiếu ấy hope it help :3
dùng đơn giản thôi,
#include <tuple>
rồi xài, nhớ bậtstd=c++14
func()
để kiểu trả về làauto
(C++14) hoặcstd::tuple<std::string, int, float>
(C++11). Đểauto
cho khỏe.std::make_tuple(...)
để “đóng gói” các giá trị lại thành 1 tuple.std::tie(...)
để lấy từng giá trị trong tuple ra.C++17 hứa hẹn cho viết dễ hơn nữa: xài
auto[...]
để lấy giá trị, và chẳng cần nhớ nó trả về kiểu giá trị gì. (vd ở đây chẳng cần nhớs
,n
,f
kiểu giá trị là gì)trước C++11 thì phải tạo định nghĩa 1 kiểu struct rồi trả về struct này. Hoặc có thể truyền tham chiếu vào hàm cần trả về nhiều giá trị.
Yeah mình cũng thử dùng đến struct và cuối cùng nó cũng hoạt động được cám ơn bạn
cho em hỏi bật std=c++14 ở đâu ạ
Option đó của g++. Bạn dùng VS?
Thực ra hai trị thì dùng
std::pair
được rồi,std::tuple
đến C++11 mới có và nó là trường hợp tổng quát. Không nên dùng makeshiftstruct
mà chỉ nên viết thẳng vào prototype.tùy vào bạn đang dùng compiler gì, gu gồ tìm cách bật C++14 cho compiler đó là lẹ nhất
À tại em tưởng đâu dùng dòng lệnh luôn ạ :v nếu em xài bên g++ thì làm sao ạ?
Bạn thêm tham số
-std=c++14
vào sau cách gọi g++ bt của bạn.-std=c++1x
)-std=c++14
.Mình ngày trc code C++ thỉnh thoảng cũng muốn trả về hơn 2 giá trị mà k biết làm thế nào …
Thế là nghĩ ra việc dùng mảng với con trỏ …
Bằng cách gán các giá trị cần trả vào 1 mảng nào đó .Sau khi kết thúc hàm thì trả về cái mảng ấy(Dùng con trỏ ) ! Rồi sau đó sử dụng ở main !
Giờ mình mới biết đến tuple .Căn bản sách dạy C++ của mềnh k có nên cũng k biết
Sao mọi người nghĩ phức tạp vậy nhỉ. Trả về 1 array, object hoặc 1 string cũng được mà.
@Kulteam viết như vậy không bảo trì được.
@^: như trên.
Bạn có thể chỉ ra cái khó ở đây không
vd trả về 3 kiểu khác nhau thì sao? Trả về {string, int, float} thì đâu có xài mảng được. Trả về string rồi phải parse string này thành {string,int,float} thì bó tay.com Trả về object chứa string, int, float thì ok, nhưng mất công viết 1 cái class/struct mà có thể chỉ xài 1 lần để trả về {string,int,float} ở cái hàm này.
trong Python có cho trả về nhiều kiểu rất là khỏe:
C++ cũng bắt chước với
std::tuple
, nhưng phải viết dài dòng hơn:std::make_tuple(...)
và khi lấy ra phải viếtstd::tie(...)
và khai báo từng kiểu trả về trước đó. C++17 cho viết theo kiểuauto[...]
mà ko cần khai báo kiểu trước đó nữa thì quá sướngcompile thử với C++17: https://godbolt.org/g/PFYYZl
ko khác Python là bao
edit: nếu viết kiểu trả về ra rõ ràng thì có thể viết gọn hơn, xài initializer_list thay cho
std::make_tuple
:Cho mình hỏi sao không dùng tham chiếu mà lại cố gắng trả về nhiều giá trị? Liệu trả về nhiều giá trị sẽ có thể dễ phát triển, bảo trì hơn?
Theo nguyên tắc self-documenting code (self-descriptive thì đúng hơn) thì nên dùng tham chiếu hay struct do ko thể đặt tên cho thành phần trong
std::tuple
.Nhưng dùng struct sẽ dẫn đến những tên struct “bá đạo” (phải đặt là
outputFunc
+ tên hàm hay đại loại vậy).Điều này cho thấy trả về một
std::tuple
chỉ nên xài ở C++1z mode (chưa có 17).return về một arraylà cách hay nhất.