1

Тема: Допоможіть знайти помилку!

//=========================================================================================================================
#include<stdio.h>
//#include<conio.h>
#include<string.h>

#define u8 unsigned char

//=========================================================================================================================
int OccupyPolygon(int j,int k,int n,int m) //функція введення координат
{
    printf("Coordinats 4 'x' ");  //координати для хрестиків
    scanf("%1d%1d", &j,&k);

    printf("coordinats 4 '0' ");  //координати для нуликів
    scanf("%1d%1d", &n,&m);
    return j,k,n,m;
}
//=========================================================================================================================
int CheckPolygon(int j,int k,int n,int m)  //перевірка введених значень на валідність
{
  if((j==0) || (k==0) || (n==0) || (m==0)){
       printf("wrong!!!try again!!!");
        return 0;}
  if((j == n) && (k == m)){
           printf("This quater is occupied by 'x' !!! ");
          return 0;}
  if((j > 3) || (k > 3) || (n > 3) || (m > 3)){
            printf("wrong!!!try again!!!");
        return 0;}

  return 1;
}
//=========================================================================================================================
char PrintPolygon(int j,int k,int n,int m,char **buf)//заповнення клітинок за координатами
                                                // і виведення на екран
{

    if(buf[j][k]=='*')
        buf[j][k]='x';
    else printf("Occupied already!!!");
    if(buf[n][m]=='*')
        buf[n][m]='0';
    else printf("Occupied already!!!");

    for(int v=1;v<4;v++){
        printf("%s \n",buf[v]);
            }
    return **buf;
}
//========================================================================================================================
u8 cmp(char* buff, char c)   
{
   for(int i=1;i<4;i++){
   if ( buff[i]     != c &&
        buff[i + 3] != c &&                  //0   1 2 3
        buff[i + 6] != c)                    //4   5 6 7
        return 0;
   else break;}
                                             //8   9 10 11     
   return 1;                                //12 13 14 15 
}
//===============================================================================================
int crosscheck(char* buf,char c)
{
    if(((buf[1]==c) && (buf[7]==c) && (buf[13]==c)) ||
       ((buf[3]==c) && (buf[7]==c) && (buf[11]==c))){
                return 1;
        }
    return 0;

}
//========================================================================================================================
int ChoseWinner(char** buf)
{
    char* s= " xxx";
    char f= 'x';
    
    char* q= " 000";
    char o= '0';

    if((strstr(buf[1],s)!= NULL) || (strstr(buf[2],s)!=NULL) || (strstr(buf[3],s)!=NULL)
            || (cmp((char *)buf,f)!= 0) || (crosscheck((char*)buf,f)!=0)){  
              printf("x winz!");
              return 1;}
  else if((strstr(buf[1],q)!= NULL) || (strstr(buf[2],q)!=NULL) || (strstr(buf[3],q)!=NULL)
            || (cmp((char *)buf,o)!= 0) || (crosscheck((char* )buf,o)!=0)){
            printf("0 winz!");
            return 1;
            }
    return 0;          
}
//========================================================================================================================
int main()
{
    int i=1,j,k,n,m;
     char buf[4][4]={" ***"," ***"," ***"};

    for(i;i<9;i++){
        OccupyPolygon(j,k,n,m);
            if(CheckPolygon(j,k,n,m)==0){
                i--; continue;
            }
        PrintPolygon(j,k,n,m,(char **)buf);
            if(ChoseWinner((char **)buf)==0){
                i--; continue;
            }
    }

    //getch();
    return 0;
}

2

Re: Допоможіть знайти помилку!

В чому полягає помилка конкретизуйте?

Подякували: koala1

3

Re: Допоможіть знайти помилку!

вирішив написати хрестики -нолики на C,помилки повиправляв,але при самій роботі програми вибиває помилку EAcces Violation.
Вибиває під час виконання функції CheckPolygon.
Друг порадив шукати проблеми десь у самій логіці ,але я ніяк неможу знайти((((

4

Re: Допоможіть знайти помилку!

EAcces Violation - це коли Ви намагаєтесь отримати доступ до пам_яті, до якої доступу не маєте. Я думаю що помилка в виході за межі масивів, в Вас там їх багато. В дебагері подивіться в якому саме рядку виникає виключна ситуація, і потім копайте там

5

Re: Допоможіть знайти помилку!

Для початку виправіть попередження компілятора, може, щось спаде на думку.
В CheckPolygon немає проблем.
А нащо ви перетворюєте char[][] на char **? Це принципово різні типи. В C є кілька варіантів того, що використовується як багатовимірні масиви, і вам слід обрати один з них перед тим, як працювати. Оскільки тут розмір фіксований, я б радив писати просто char [4][4].

6

Re: Допоможіть знайти помилку!

якраз  прикол в тому,що компілятор не видає ні помилок,ні попереджень)помилка зявляється вже під час роботи програми,а саме виконання функції CheckPolygon(а там масивів взагалі немає))
А типи перетворював бо інкаше компілятор свариться:?

7

Re: Допоможіть знайти помилку!

а ще + постійно виводиться на екран перший пункт функції CheckPolygon,а саме
if((j==0) || (k==0) || (n==0) || (m==0)){
       printf("wrong!!!try again!!!");
        return 0;}
притому неважливо чи значення валідне чи ні(якраз на цьому пункті і вискакує EAcces Violation)

8 Востаннє редагувалося Chemist-i (12.02.2014 17:28:32)

Re: Допоможіть знайти помилку!

Бо у Вас виникає нескінченний цикл тут

    for(i;i<9;i++){
        OccupyPolygon(j,k,n,m);
            if(CheckPolygon(j,k,n,m)==0){
                i--; continue;
            }
        PrintPolygon(j,k,n,m,(char **)buf);
            if(ChoseWinner((char **)buf)==0){
                i--; continue;
            }
    }

бо ітератор в циклі for намагається збільшитись і++, а в функціях зменшитись i--;, а по факту є на одному місці, звідки умова i<9 завжди повертає true, навіть через мільйон ітерацій.

Подякували: koala, yomko13962

9

Re: Допоможіть знайти помилку!

як я люблю цей форум)))))

10

Re: Допоможіть знайти помилку!

yomko1396 написав:

А типи перетворював бо інкаше компілятор свариться:?

Ну то поставте правильні типи - і не буде сваритися, і працюватиме.

11

Re: Допоможіть знайти помилку!

не свариться вже і працює)але неправильнО)дуже дякую всім)