6

私は C++ で初心者の問題を抱えています。次のように定義され
た構造体があります。Edge

struct Edge {
    int position[4];
    int average;
};

ここで、これらの構造体をたくさん作成する必要があり、そのためのヘルパー メソッドを作成しました。これは、いくつかのパラメーターに基づいてこれらの構造体の配列を作成します。

Edge* createEdges(int some_parameters){
    Edge *edges = new Edge[8];

    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1; //fill the rest of the edge array in the same manner
        edge.average = 10;

        edges[i] = edge;
    }

    return edges;
}

ただし、今電話Edge *edges = createEdges(int some_parameters)すると、エッジ配列に適切なデータがありません(範囲外ですか?)。

ここでいくつかのことを混同していると思いますが、データ構造に頼らずにこれを機能させることができればvector幸いです。これはこれを処理する通常の方法ですか、それともエッジ配列を自分で宣言し、それをヘルパー メソッドに渡して埋める必要がありますか?

編集:

まず第一に、コメント/ヒント/ヒント/アドバイス/...私が見落としていた問題を簡単に見つけるのを助けてくれた皆さんに感謝します.
コードが機能するはずであるという返信を見た後、簡略化されたコードもテストしました (最初に行うべきことでした)。驚くべきことに、機能しました。次に、実際のコードが機能せず、簡略化されたバージョンが機能した理由を確認しました。
私の実際のコードは次のようになりました。

Edge* createEdges(int some_parameters){
     Edge* edges = new Edge[8];
     if(some_parameter != 0){
          //create the edges as in my 1st snippet
          return NULL; //doh, should return edges here !
     } else { 
          return NULL;
     }
}

単純に間違った値 (NULL) を返したことに気付かなかった理由は、デバッガーが0xf6f6f6いくつかの負の値を持つアドレスを表示したためですedge.position(よく理解できないもので、単に表示されるべきだったのです0x000000が、おそらく私は想像するだけです)。

全体として、これは、午前 3 時以降にコーディングしてはならない理由についての重要な教訓でした。

4

4 に答える 4

3

それはC++の使用std::vectorです:

std::vector<Edge> createEdges(int some_parameters){
    std::vector<Edge> edges;

    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1;
        edge.average = 10;
        edges.push_back(edge);
    }

    return edges;
}
于 2012-10-24T13:07:52.757 に答える
2

ここにあるものはうまく機能します。あなたが忘れていると私が感じるのは、あなたが電話するときです

Edge *edges = createEdges(int some_parameters)

そのedges変数は、リストの最初の要素へのポインターです。あなたがそうすることになった場合:

edges[0]

また:

edges[1]

これらは異なる値であることがわかります。次に、配列にアクセスするためにループする必要があります。ループ中に配列の最後を通過しないことに注意してください。これが、イテレータでより多くの安全機能を使用できるため、ほとんどの人がベクトルを使用すると言う理由です。

于 2012-10-24T13:19:31.950 に答える
2

C ++へようこそ!クラスのインスタンスを作成するためのヘルパーメソッド(C ++の構造体は、すべてのフィールドがパブリックであるクラスです)は、コンストラクターと呼ばれます。コンストラクターを使用して、エッジクラスのインスタンスを作成する方法は次のとおりです。

class Edge {
public:
    int position[4];
    int average;
    Edge();
};

Edge::Edge() //constructor
{
    position[0] = 1;//fill the rest of the edge array in the same manner
    average = 10;
}

int main()
{
    Edge* myEdge = new Edge(); //constructor called
    Edge* myEdges[8];
    for (int i = 0; i < 8; i++)
    {
        myEdges[i] = new Edge();
    }
    return 0;
}
于 2012-10-24T13:19:44.450 に答える
1

関数でエッジを作成し、作成されたすべてのエッジを含むベクトルを返す少し変更されたバージョンを次に示します。

#include <iostream>
#include <vector>

struct Edge {
    int position[4];
    int average;
};

std::vector< Edge > createEdges(int some_parameters){
    std::vector< Edge > edges( 8 );

    for(int i = 0 ; i < 8; i++){
        const Edge edge{ { 1, 0, 0, 0 }, 10 };

        edges[i] = edge;
    }

    return edges;
}


int main()
{
    auto e( createEdges(5));

    std::cout<<e[0].average<<std::endl;
}

いくつかの変更があります:

  1. エッジの配列を割り当ててポインターを返す代わりに、ベクトルを返します
  2. エッジ オブジェクトの作成方法と初期化方法 (これが求められていると思います)
于 2012-10-24T13:16:14.373 に答える