0

編集済み:

     #include<iostream>
using namespace std;
#include<conio.h>
#include<string.h>

void dfsvisit(int a[][30], int i, const char *color[])
     {
        int v;
        int p[30];
        int f[30]={};
        static int j=1;
        color[i]="gray";

        for(v=1;v<31;v++)
            while(a[i][v]!=0)
                if(!strcmp(color[a[i][v]],"white"))
                    {
                        p[a[i][v]]=i;
                        dfsvisit(a,i,color);
                    }

        color[i]="black";
        j++;
        f[i]=1;
        cout<<f[i]<<" ";
     }

int main()
{
    int a[][30]={{2, 16},{4, 8},{5, 16, 21},{1, 2},{1, 9, 27},{1, 10, 15},{4, 6, 11, 12},{4, 16},{2, 19, 29},{3, 14, 28},{3, 13, 15, 17},{8, 9, 18, 26},{1, 7, 10, 19},{5, 8, 20, 24},{3, 21, 29},{1, 2, 8},{16, 23, 28, 29},{4, 12, 21, 24},   {3, 15, 16},{2, 3, 6, 22},{4, 15, 25},{4, 6, 20, 24},{9, 10, 11, 12},{19, 26, 30},{2, 27, 29},{1, 28, 29, 30},{8, 16, 29},{6, 10, 30},{19, 21, 27},{1, 2, 3, 22}};
    int i;
    const char *color[30];

    for(i=1;i<31;i++)
        color[i]="white";

    for(i=1;i<31;i++)
        if(!strcmp(color[i],"white"))
            dfsvisit(a,i,color);

    return 0;

}

const char c私が正しいものを使用しているかどうかを確認したいだけですか?はいの場合、他にどこで間違いを犯しましたか? コードブロックで実行しようとしています。コンパイルはうまくいきますが、実行しようとすると、プログラムが動作を停止したことが示されます。

ありがとう。

4

6 に答える 6

3

変化する:

for(i=1;i<=30;u++)

に:

for (i = 0; i < 30; i++)
于 2011-03-24T21:24:38.747 に答える
2

あなたはこう言います:

for(i=1;i<=30;u++)

コンパイルしますか?

をに変更することをお勧めしuますi...

編集: OK、あなたはそれuがタイプミスだったと言います。次のステップ: デバッガーで物事を開始し、ループするのを待ち、中断してステップスルーします。これにより、ループ変数に何かが発生した場所がわかります。

編集 2:
< ニグル >
std::string の使用を提案するすべての人に賛成します。std::vectors の s を優先して不規則な配列を削除することを検討するかもしれませんstd::vector。これは、イテレータを使用することで、ループ内のフェンスポスト エラーをキャッチします。一般に、STLvectorはアレイよりも安全で快適ですが、高速で小型です。また、関数スコープ ( RAII
) の先頭で はなく、内部でループ変数を宣言することをお勧めします。もちろん、ループ後にその値が必要な場合を除きます。 < /ニグル >for

編集 3:
std::string、std::vector、および std::otherStuff の詳細については、本Accelerated C++が C++、特に STL の優れた紹介を提供します。や配列のような概念char*は、STL のやり方が安全にカバーされ、実践された後、かなり遅く出てきます。Boostライブラリにそのようなものを見たいと思っています...

于 2011-03-24T21:22:32.443 に答える
2

まず、for ループが正しくありません。次のようになります。

for(i = 0; i < 30; i++)

次に、配列は(2、3、または 4 つの整数の 30 要素) のint a[][30]ようにする必要があります。int a[30][]

第三に、このような配列を渡すことはできません。ポインターを使用してください。

さて、このコードは明確ではなく、再帰関数によってスタック オーバーフローが発生する可能性があります。

お役に立てば幸いです。

于 2011-03-24T23:49:00.690 に答える
2

ポインターを定数文字列と比較していますが、文字列が等しい場合は等しい場合とそうでない場合があります。enumこの種のアルゴリズムには を使用します。

enum { BLACK, GRAY, WHITE };
于 2011-03-24T21:17:05.250 に答える
1

文字列比較に == の代わりに strcmp を使用したい。

ただし、これがハングする理由は明らかではありません。これを無限ループに陥らせる可能性のあるコードを削除しました。

于 2011-03-24T21:20:47.500 に答える
1

いいえ、C スタイルの文字列 ( ) を正しく使用していませんchar *。あきらめて、std::string代わりに使用してください。

例えば:

const char *color[30];

for(i=1;i<31;i++)
    color[i]="white";

上記のフラグメントは、ポインターをコピーし、テキストの複製を作成しません。これは、あなたが望んでいたものかもしれませんし、そうでないかもしれません。

より安全に書き直しました:

const char * color[30]; // 30 pointers to char.
const char text_white[] = "white";

for (i = 0; i < 30; ++i)  // Note addition of spaces
{
   color[i] = text_white;
}

は、定数データへconst char text_white[]のポインター を宣言します。text_whiteこれにより、リテラルに割り当てようとしたときにコンパイラに通知されます。

このための C++ コード:

typedef std::vector<std::string> Text_Container;
Text_Container texts;
const std::string white_text("white");
const unsigned int MAX_TEXTS = 30;
for (i = 0; i < MAX_TEXTS; ++i)
{
    texts[i] = white_text;  // Makes a copy of the string.
}

プログラムでメモリを節約する必要がchar *ない限り、テキストはあきらめてください。とを優先します。std::stringstd::vector

于 2011-03-24T23:46:58.920 に答える