1

typedef構造体の配列があります。

それはそのように宣言されています:

vertex vertexArray[numberVertices];

次に、これをメインコードに含めます。

 for(i=0;i<numberVertices;i++)
        {
                if(vertexArray[i].source == 5)
                {
                        source = vertexArray[i].number;
                        walk(vertexArray, vertexArray[i], source, headMaxPairList );
                }
        }

うまくいけば、散歩を実行するには:

    void walk(vertex *vertexArray, vertex v, int source, maxPairing *head)
{
    int i;
    adjEdge *traverse;
    int moveVertex;
    int sink;




            moveVertex = vertexArray[v.number-1].number;
            if(vertexArray[moveVertex-1].color != 5 && vertexArray[moveVertex-1].sink == 5)
            {
                    sink = vertexArray[moveVertex-1].number;
                    vertexArray[moveVertex-1].color = 5;
                    addMaxPair(head, source, sink);
            }
            else
            {
                    walk(vertexArray, vertexArray[moveVertex-1], source, head);
            }

}

ただし、関数でセグメンテーション違反が発生しています。

in walk (vertexArray=Cannot access memory at address 0x7fffff3fefe8

これは、vertexArrayを渡す方法と関係があると思います。

配列は実際にはポインターであるため、vertex *vertexArray個々のメンバーは単なる頂点であり、ポインターではないことを理解していますvertex v

誰かがこれを正しく通過させるのを手伝ってくれるなら、私は感謝するでしょう。

ちなみに、私の散歩が正しく機能するように見えるかどうか誰かがわかるなら、それはプラスです!

4

1 に答える 1

2

配列はポインタと同じではありません。

明確にするために次のリンクを読んでください:

Q:では、Cの「ポインターと配列の同等性」とはどういう意味ですか?

http://c-faq.com/aryptr/aryptrequiv.html

Q:しかし、chara[]はchar*aと同じだと聞きました。

http://c-faq.com/aryptr/aryptr2.html

セグメンテーション違反を回避するには、walk()関数に次のチェックを追加します。

void walk(vertex *vertexArray, vertex v, int source, maxPairing *head)
{
    int i;
    adjEdge *traverse;
    int moveVertex;
    int sink;


    /* Add this Check to Avoid Seg Fault, you need to make the value of  
      'numberVertices'available to this function as this is your array size */

    if ((((v.number-1)<0)||((v.number-1)>numberVertices))
    {
       return;
    }
    /* Check Ends */

            moveVertex = vertexArray[v.number-1].number;

    /* Another Check */
    if((moveVertex-1<0)||(moveVertex-1>numberVertices))
    {
       return;
    }
    /* Check Ends */

            if(vertexArray[moveVertex-1].color != 5 && vertexArray[moveVertex-1].sink == 5)
            {
                sink = vertexArray[moveVertex-1].number;
                vertexArray[moveVertex-1].color = 5;
                addMaxPair(head, source, sink);
            }

            else
            {
                    walk(vertexArray, vertexArray[moveVertex-1], source, head);
            }
于 2012-10-10T03:06:01.170 に答える