Использование указателей с объединениями, массивами и функциями - PullRequest
1 голос
/ 22 марта 2012

Мне так и не удалось полностью понять, что происходит на фоне передачи указателей на функции и как вы их используете.Прямо сейчас я кодирую микропроцессор в c.Основная цель - создать игру типа змеи, в которой используется акселерометр.Излишне говорить, что мой код заполнен ошибками, связанными с имплантацией указателя.

Позвольте мне попытаться разбить его.Сначала у меня есть объединение

    typedef union
{
    UINT8       byte;

    struct
    {
        UINT8   x  : 4;
        UINT8   y  : 4;
    };

} snake;

Объединение хранит координаты x и y узла в змее.Я использую этот метод, поэтому, когда я проверяю, существует ли байт, я могу сделать это, используя байт.В любом случае я инициализирую его как массив «snake location [64]», который находится в главной функции.У меня также есть int длины и головы и хвоста змеи.Однако попытка передать союз или что-то еще, где у меня возникла проблема.Пока что мои прототипы для функций:

void randGen(UINT8* x, UINT8* y);
void nextMove(snake* body, int* length, int* head, int* tail);
BOOL setLocation(snake* body,snake temp, int* length, int* head, int*tail, BOOL* newTerm);
void clearLocation(snake* body,snake temp, int* length, int* tail, BOOL* repeat);
void reset(int* length, int* index, UINT8* location);
UINT8 readDirection();
void gameOver();

Вот фрагмент функции nextMove.У меня в значительной степени просто больше операторов if с более или менее одинаковым кодом, поэтому для простоты.

void nextMove(snake* body[], int* length, int* head, int* tail){
    UINT8 direction;
    int i;
    snake temp;
    temp = *body[*head];
    do {
    direction = readDirection();
    } while(direction != 4);
    if(direction == 0) { //up
        if(temp.y == 0) gameOver();
        temp.y -= 1;
        for(i = 0; i < *length; i++) {
            if (body[i]->byte == temp.byte) gameOver();
        }
        if(temp.byte == locOfApple.byte) {

        }
        else {
            clearLocation(body, *temp, length, tail, FALSE);
            setLocation(body, *temp, length,head,tail, FALSE);
            *body[*tail] = temp;
            head = tail;
            if(++tail >= length) tail = 0;

        }

    }

В основном мне просто нужно знать, как настроить прототип, как использовать указатель какзначение в функции и что передать функции.Если передача массива (который, я считаю, отличается от передачи int) отличается, если кто-то может объяснить хороший способ думать об этом, который действительно поможет мне понять эту концепцию.

Любая помощь будет оценена :)

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Я понял это.Мне нужно было настроить объединение как

typedef union
{
    UINT8       byte[64];

    struct
    {
        UINT8   x  : 4;
        UINT8   y  : 4;
    }cord[64];

}body;

Это позволяет мне передавать его как массив и видеть все значения.

0 голосов
/ 22 марта 2012
void nextMove(snake* body[], int* length, int* head, int* tail) 

должен написать так

void nextMove(snake* body, int* length, int* head, int* tail) 

или

void nextMove(snake body[], int* length, int* head, int* tail)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...