Использование указателей для изменения матрицы - PullRequest
0 голосов
/ 28 ноября 2018

В нашем курсе c учитель дал нам мини-проект по созданию игры "Реверси".У меня проблемы со сборкой платы.

#define Size 8
int main()
{
    char Board[Size][Size] = { {" "} };
    resetBoard(Board);
    printBoard(Board);
    printf("\n");
    getch();
}
void resetBoard(int** board)
{
    for (size_t i = 0; i < Size; i++)
    {
        for (size_t j = 0; j < Size; j++)
        {
            *(board + (i * Size + j)) = 'x';
        }
    }
}
void printBoard(int board[Size][Size])
{
    for (size_t i = 0; i < Size; i++)
    {
        for (size_t j = 0; j < Size; j++)
        {
            printf("%c", board[i][j]);
            printf(" ");
        }
        printf("\n");
    }
}

Я проверил программу, и программа получает:

Ошибка проверки во время выполнения # 2 - Стек вокруг переменной'Board' был поврежден

при изменении первого X в третьей строке.Например, если я запускаю программу до конца 2-й строки (16), я не получу эту ошибку.

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

ниже указатель версии моего предыдущего предложения:

#include<stdio.h>
#include<stdlib.h>

#define Size 8

void resetBoard(char *board, int size);
void printBoard(char *board, int size);

int main()
{
    char *Board = (char *)malloc(Size*Size*sizeof(char));
    resetBoard(Board, Size);
    printBoard(Board, Size);
    printf("\n");
   free(Board);

    return 0;
}

void resetBoard(char *board, int size)
{
    for (size_t i = 0; i < size; i++)
    {
        for (size_t j = 0; j < size; j++)
        {
            *(board +i*size + j) = 'x';
        }
    }
 }

 void printBoard(char *board, int size)
 {
      for (size_t i = 0; i < size; i++)
      {
           for (size_t j = 0; j < size; j++)
           {
                printf("%c ", *(board +i*size + j));
           }
           printf("\n");
      }
  }

Компиляция (на моей машине) выглядит снова, как:

gcc -std=c11 -Wall reversi.c -o a.out

иисполнение дает:

./a.out
x x x x x x x x
x x x x x x x x 
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
0 голосов
/ 28 ноября 2018

Вы получили кучу ошибок в вашем коде.См встроенные комментарии

0 голосов
/ 28 ноября 2018

@ RotemHeinig.В вашем коде много недостатков.Ниже приведен пример переформатирования вашего примера.Возможно, это даст вам представление о том, как улучшить работу:

#include<stdio.h>

#define Size 8

void resetBoard(char board[][Size]);
void printBoard(char board[][Size]);

int main()
{
    char Board[Size][Size];
    resetBoard(Board);
    printBoard(Board);
    printf("\n");

    return 0;
}

void resetBoard(char board[][Size])
{
    for (size_t i = 0; i < Size; i++)
    {
        for (size_t j = 0; j < Size; j++)
        {
            board[i][j] = 'x';
        }
    }
 }

 void printBoard(char board[][Size])
 {
     for (size_t i = 0; i < Size; i++)
     {
         for (size_t j = 0; j < Size; j++)
         {
              printf("%c ", board[i][j]);
              printf(" ");
         }
         printf("\n");
     }
  }

Компиляция этого кода с помощью gcc на моей машине выглядит так:

gcc -std=c11 -Wall reversi.c -o a.out

И исполнение дает:

./a.out
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x

Я надеюсь, что вы найдете здесь вдохновение.

0 голосов
/ 28 ноября 2018

Я думаю, что могут быть проблемы с инициализацией вашей платы как типа char и работой с указателями и массивом типа int в ваших функциях.Char имеет размер 1 байт, а int имеет больший размер в зависимости от платформы (чаще всего 4 байта).Это вызовет проблемы с памятью при манипуляциях и зацикливании вашего массива.

В вашем случае, похоже, что вы перебрали всю выделенную память после 2 строк, потому что вы использовали указатели типа int.Int в вашем случае, вероятно, в 4 раза больше, чем char, что приводит к циклической обработке всей структуры данных типа char в 4 раза быстрее, чем вы ожидали.

...