私は C++ プログラミングが初めてで、すべての一般的な仕切りを配列に与える関数を作成し、後でそれを使用したいと考えています。int main()
関数から配列を返すことは可能ですか:D?
ありがとうございました!
私は C++ プログラミングが初めてで、すべての一般的な仕切りを配列に与える関数を作成し、後でそれを使用したいと考えています。int main()
関数から配列を返すことは可能ですか:D?
ありがとうございました!
次のような動的にサイズ変更されたコンテナーを返すのstd::vector
が最適なユース ケースです。
#include <vector>
...
std::vector<int> dividers(int x, int y) {
std::vector<int> divi;
...
return divi;
}
値で返すとコピーが作成され、ダングリング ポインターがなくなります。これは、ポインターを介してローカル配列を返す場合に当てはまります。関数が終了すると、ポインターがガベージを指したままになると、メモリが失われます。
はい、ポインターの形式で配列を返すことは可能ですが、事前にそのサイズがわからないため、これはお勧めできません。ただし、ローカル変数 (スタックに割り当てられている!!) のアドレスを返さないように注意してください。コードのもう 1 つの問題は、初期化していないことですd
。推奨される C++ の方法は、型のベクトルを返すことです (もう必要ありd
ません) 。
#include <vector>
....
vector<int> dividers(int y,int x){
int yx;
vector<int> divi;
divi.reserve(100);
if(y > x){
yx = y;
}
if(x > y){
yx = x;
}
for (int n = 1; n <= yx; n++){
if ((n%y==0) && (n%x==0)){
divi.push_back(n);
}
}
return divi;
}
メイン関数にあるループを変更するには、イテレータについても読む必要があります。
私のコードの大きな間違いは削除されました...指摘してくれてありがとう。あなたが配列で持っていたのと同じ間違いをベクトルでしました。今修正...愚かな私...
いいえ、できません。ベクトルを返すか、配列の最初の要素へのポインターを関数に渡すことができます。
あなたのコードを見ると、ポインターオプションは次のようになります
int dividers(int y,int x, int* divi){
...
}
int main()
{
int divi[100];
...
dividers(x, y, divi);
}
ベクトル解は次のようになります
std::vector<int> dividers(int y,int x){
std::vector<int> divi;
...
divi.push_back(n); // when you want to add a divider to your vector
...
return divi;
}
int main()
{
std::vector<int> divi;
...
divi = dividers(x, y);
}
次のことができます。
typedef int arrT[10]
arrT *func() {}
arrT を 10 個の int の配列のエイリアスとして定義するか、
int (*func())[10]{}
これにより、10 個の int の配列を返すために逆参照されたときに func を定義しています。
そのusing
ような宣言using arrT = int[10]
も可能です。
他の人が指摘したように、必要な型を含む関数から std::vector を返すことは、として宣言された関数で可能std::vector<int> func(){}
です。
また、別のコンテナーstd::array<>
を使用して、組み込みの配列を完全に忘れることもできます。