Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Нужен взгляд со стороны. Еще раз. [РЕШЕНО]  (Прочитано 1084 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ChaosWarrior

  • Автор темы
  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
//Погнали проверять
bool MyLovelyThread::CheckPANRow(int RowIndex)
{
    int Sum[9];

    for (int index = 0;index<10;index++) {Sum[index] = 0;}

    for (int index = 0;index<9;index++) {Sum[gamepad[RowIndex][index]]++;}

    for (int index = 1;index<10;index++) {if (Sum[index]>1){return false;}}
    return true;
}

bool MyLovelyThread::CheckPANCol(int ColIndex)
{
    int Sum[9];

    for (int index = 0;index<10;index++) {Sum[index] = 0;}

    for (int index = 0;index<9;index++) {Sum[gamepad[index][ColIndex]]++;}

    for (int index = 1;index<10;index++) {if (Sum[index]>1){return false;}}

    return true;
}

bool MyLovelyThread::CheckPANBlock(int RowIndex, int ColIndex)
{
 int Sum[9];

 for (int index = 0;index<10;index++) {Sum[index] = 0;}

 for (int indexR = RowIndex;indexR<RowIndex+3;indexR++)
 {
  for (int indexC = ColIndex;indexC<ColIndex+3;indexC++)
  {
   Sum[gamepad[indexR][indexC]]++;
  }
 }

 for (int index = 1;index<10;index++) {if (Sum[index]>1){return false;}}

 return true;
}

bool MyLovelyThread::CheckPANRowZ()
{
    for (int index = 0;index<9;index++) {if (CheckPANRow(index) == false) {return false;}}
    return true;
}

bool MyLovelyThread::CheckPANColZ()
{
    for (int index = 0;index<9;index++) {if (CheckPANCol(index) == false) {return false;}}

    return true;
}

bool MyLovelyThread::CheckPANBlockZ()
{
    for (int indexR = 0;indexR<3;indexR++)
    {
     for (int indexC = 0;indexC<3;indexC++)
        {
            if (CheckPANBlock(indexR*3,indexC*3) == false) {return false;}
        }
    }

    return true;
}

bool MyLovelyThread::CheckPAN()
{
    if (CheckPANBlockZ() == false)
    {
     return false;
    }
    else
    {
     if (CheckPANRowZ() == false)
     {
      return false;
     }
     else
     {
      if (CheckPANColZ() == false)
      {
       return false;
      }
     }
    }

    return true;
}

//Решить
bool MyLovelyThread::REVERS()
{
    int indexR = 0;
    int indexC = 0;
    int index = 0;
    bool FreeCell = false;
    bool Result = false;

    //Показать, что уже нарешалось
    ShowMe();

    while ((FreeCell == false)&&(indexR<9))
    {
     indexC = 0;
     while ((FreeCell == false)&&(indexC<9)) {if (gamepad[indexR][indexC] == 0) {FreeCell = true;} else {indexC++;}}
     if (FreeCell == false) {indexR++;}
    }

    if (FreeCell == false)
    {
     return true;
    }
    else
    {
     Result = false;
     index = 1;
     while ((Result == false)&&(index<10))
     {
      gamepad[indexR][indexC] = index;
      if (CheckPAN()) {Result = REVERS();}
      index++;
     }

     if (Result == false) {gamepad[indexR][indexC] = 0;}
    }

    return Result;
}

Что здесь не так?
По результатам исследований, функция bool MyLovelyThread::CheckPANRow(int RowIndex) вызывается бесконечно, из-за того, что вызывающая ее
bool MyLovelyThread::CheckPANRowZ()
{
    for (int index = 0;index<9;index++) {if (CheckPANRow(index) == false) {return false;}}
    return true;
}
Впадает в бесконечный цикл. Qt и C++ взрывают мне моск. Как можно зависнуть в двух строчках кода?

Пользователь решил продолжить мысль 14 Сентября 2010, 15:08:32:
На JavaScript, Delphi, VBA этот алгоритм не вызывает проблем.
« Последнее редактирование: 14 Сентября 2010, 15:56:26 от ChaosWarrior »
Открытый код и его подержка — это лучшая реклама Windows.

Оффлайн ierofant

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: Нужен взгляд со стороны. Еще раз.
« Ответ #1 : 14 Сентября 2010, 15:27:31 »
Не стал разбирать во всём коде, потому что сразу насторожили первые две строчки
   
    int Sum[9];
    for (int index = 0;index<10;index++) {Sum[index] = 0;}


У вас в массиве 9 элементов, почему вы обнуляете 10? Исправте хотя бы это место. Дальше посмотрим.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Нужен взгляд со стороны. Еще раз.
« Ответ #2 : 14 Сентября 2010, 15:54:02 »
А кстати это может быть проблемой. Если компилятор выделяет памть на стекре последовательно, то там будте 9 интов от Sum[9] а следом будет 10м элементом как раз локальная переменная цикла. Хотя это сильно зависит от компилятора и на разных компиляторах разное поведение возможно. Можно проверить сделав так:
int Sum[9];
for (int index = 0;index<10;index++) {
    std::cout << "index: " <<  index << std::endl;
    Sum[index] = 0;
    std::cout << "index: " <<  index << std::endl;
}

Оффлайн ChaosWarrior

  • Автор темы
  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Re: Нужен взгляд со стороны. Еще раз.
« Ответ #3 : 14 Сентября 2010, 15:55:26 »
Так и есть. Спасибо, Delphi съел мои мозги.
Открытый код и его подержка — это лучшая реклама Windows.

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.