#c #arrays #pointers #methods
#c #массивы #указатели #методы
Вопрос:
Я создаю программу, имитирующую гонку зайцев и черепах. Я не понимаю, почему мой указатель для движения черепахи обновляется только один раз, когда условие выполняется несколько раз.
#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("%dn", num);
if(num >= 1 amp;amp; num <= 5)
{
printf("Fast plodn");
*tPtr = ' ';
tPtr = 3;
*tPtr = 'T';
for(int i = 0; i <SIZE; i )
{
printf("%c,", raceTrack[i]);
}
printf("n");
}
}
Я хочу, чтобы он делал это, например:
2 Быстрая работа, , ,T, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
5 Быстрая работа, , , , , , , ,Т, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , и т.д…
Вместо этого он выполняет:
2 Быстрая работа, , ,T, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
5 Быстрая работа, , ,T, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
Комментарии:
1.
tPtr
в main никогда не изменяется, поэтому он всегда указывает на первый элемент.2. OT:
srand
должен быть вызван вmain
. Если вы вызовете его вturtleMove
, случайное число будет меняться только один раз в секунду.
Ответ №1:
Вы обновляете только локальное значение 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, amp;tPtr);
Комментарии:
1. Это имеет большой смысл. Большое вам спасибо.