Программа зависает во время работы, хорошо компилируется - PullRequest
0 голосов
/ 25 марта 2011

РЕДАКТИРОВАНИЕ:

     #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 правильно? Если да, где еще я совершил ошибку? Я пытаюсь запустить его на кодовых блоках. Он хорошо компилируется, но когда я пытаюсь его запустить, он показывает, что программа перестала работать.

Спасибо.

Ответы [ 6 ]

3 голосов
/ 25 марта 2011

Изменение:

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

до:

for (i = 0; i < 30; i++)
2 голосов
/ 25 марта 2011

Во-первых, ваш цикл for неправильный, он должен выглядеть следующим образом:

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

Во-вторых, ваш массив int a[][30] должен быть похож на int a[30][] (30 элементов по 2, 3 или 4целые числа).

В-третьих, вы не можете передать такой массив, используйте указатель.

Ну, этот код не понятен, и рекурсивная функция может вызвать переполнение стека.

Надеюсь, это поможет вам.

2 голосов
/ 25 марта 2011

Вы говорите, что это:

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

компилирует

Я предлагаю изменить u на i ...

EDIT: Итак, вы говорите, что u была опечатка. Следующий шаг: запустите вещь в отладчике, подождите, пока он зациклится, взломайте его и сделайте шаг. Это должно сказать вам, где что-то происходит с вашей переменной цикла.

РЕДАКТИРОВАТЬ 2:

Я поддерживаю всех, кто предлагает вам использовать std :: string. Вы могли бы подумать об отбрасывании нерегулярных массивов в пользу std::vector с std::vector с, что при использовании итераторов выловило бы ошибку fencepost в вашем цикле. В целом, STL vector безопаснее и удобнее массива, но при этом такой же быстрый и маленький.
И в то время как это было сделано, лучше всего объявлять переменные вашего цикла внутри for вместо начала функции ( RAII ). Если, конечно, вам не нужно это значение после цикла.

РЕДАКТИРОВАТЬ 3:
Более подробно о std :: string, std :: vector и std :: otherStuff: книга Ускоренный C ++ дает хорошее введение в C ++ и особенно в STL. Такие понятия, как char* или массивы, появляются достаточно поздно, после того, как STL-способ ведения дел был благополучно раскрыт и отработан. Мне бы очень хотелось увидеть что-то подобное для библиотеки Boost ...

2 голосов
/ 25 марта 2011

Вы сравниваете указатели с константными строками, которые могут совпадать или не совпадать при одинаковых строках.Используйте enum для этого вида алгоритма:

enum { BLACK, GRAY, WHITE };
1 голос
/ 25 марта 2011

Нет, вы неправильно используете строки в стиле 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::string и std::vector.

1 голос
/ 25 марта 2011

Вы хотите использовать strcmp вместо == для сравнения строк.

Однако не ясно, почему это зависает. Вы удалили код, который может привести к бесконечному циклу.

...