Указатель в C обновляется только один раз при вызове метода - PullRequest
0 голосов
/ 24 апреля 2019

Я делаю программу, имитирующую гонку зайцев и черепах.Я не понимаю, почему мой указатель для движения черепахи обновляется только один раз, когда условие выполняется несколько раз.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define SIZE 70

void turtleMove(char raceTrack[SIZE], char *tPtr);

int main()
{
    char raceTrack[SIZE];
    for(int i = 0; i<SIZE; i++)
    {
        raceTrack[i] = ' ';
    }

    char *tPtr = raceTrack;

    for(int i = 0; i <=10; i++)
    {
        turtleMove(raceTrack, tPtr);
    }

}
void turtleMove(char raceTrack[SIZE], char *tPtr)
{
    srand(time(0));

    int num = rand() % 10 + 1;
    printf("%d\n", num);

    if(num >= 1 && num <= 5)
    {
        printf("Fast plod\n");
        *tPtr = ' ';
        tPtr += 3;
        *tPtr = 'T';

        for(int i = 0; i <SIZE; i++)
        {
            printf("%c,", raceTrack[i]);

        }
        printf("\n");

    }
}

Я хочу сделать это, например:

2 Fast plod,,, T,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

5 Fast plod,,,,,, T,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, и т.д ...

Вместо этого он делает:

2 FastPlod,,, T,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

5 Fast plod,,, T,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

1 Ответ

1 голос
/ 24 апреля 2019

Вы только обновляете локальное значение tPtr.

Ваша функция определяется как:

void turtleMove(char raceTrack[SIZE], char *tPtr);

Для этого требуется указатель на char в качестве второго аргумента, все, что находится по адресу, указанному tPtr, может быть изменено и сохранено, но значение tPtr (самого адреса) не может быть.

Чтобы изменить адрес, необходимо передать указатель на указатель на char:

void turtleMove(char raceTrack[SIZE], char **tPtr);

Затем в функции, когда вы хотите изменить символ , вы разыменовываетедважды:

**tPtr = ' ';

И когда вы хотите изменить адрес , вы разыменовываете один раз:

*tPtr += 3;

Наконец, конечно, вы должны исправить, как вызвоните turtleMove(), чтобы вы передали char**.К счастью, вы можете сделать это, просто взяв адрес tPtr, как определено в main():

turtleMove(raceTrack, &tPtr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...