0

私は C++ プログラミングが初めてで、すべての一般的な仕切りを配列に与える関数を作成し、後でそれを使用したいと考えています。int main()

関数から配列を返すことは可能ですか:D?

ありがとうございました!

コード: http://pastebin.com/K8195wzF

4

4 に答える 4

4

次のような動的にサイズ変更されたコンテナーを返すのstd::vectorが最適なユース ケースです。

#include <vector>
...

std::vector<int> dividers(int x, int y) {
    std::vector<int> divi;

    ...
    return divi;
}

値で返すとコピーが作成され、ダングリング ポインターがなくなります。これは、ポインターを介してローカル配列を返す場合に当てはまります。関数が終了すると、ポインターがガベージを指したままになると、メモリが失われます。

于 2013-03-27T15:11:09.000 に答える
1

はい、ポインターの形式で配列を返すことは可能ですが、事前にそのサイズがわからないため、これはお勧めできません。ただし、ローカル変数 (スタックに割り当てられている!!) のアドレスを返さないように注意してください。コードのもう 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;
  }

メイン関数にあるループを変更するには、イテレータについても読む必要があります。

私のコードの大きな間違いは削除されました...指摘してくれてありがとう。あなたが配列で持っていたのと同じ間違いをベクトルでしました。今修正...愚かな私...

于 2013-03-27T15:09:35.580 に答える
-1

いいえ、できません。ベクトルを返すか、配列の最初の要素へのポインターを関数に渡すことができます。

あなたのコードを見ると、ポインターオプションは次のようになります

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);
}
于 2013-03-27T15:03:57.230 に答える
-1

次のことができます。

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<>を使用して、組み込みの配列を完全に忘れることもできます。

参照:

C++ 入門書; リップマン、ラジョワ、ムー

于 2013-03-27T15:26:16.613 に答える