Указатель в C дает отрицательные значения - PullRequest
0 голосов
/ 22 февраля 2019

То, что я пытаюсь сделать, это когда значение harePosition меньше 1, чем я хочу, чтобы оно равнялось 1. Но когда я печатаю значение, оно дает мне отрицательные значения.

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

int main()
{
int *harePosition = 1, *tortoisePosition = 1;

bool running = 1;

char *sameSpot = "OUCH!!!";

printRace();

srand(time(NULL)); //Allows rand() to create random numbers

while(running){

    harePosition = moveHare(harePosition); //calls the function to determine what action will be taken

    printf("Hare Position is: %d\n", harePosition); //prints to the screen, I'm using this to troubleshoot if the issue was resolved. 

    tortoisePosition = tortoiseMove(tortoisePosition);

int *moveHare(unsigned int *harePosition) // function where the issue is happening
{

int hareAction;

hareAction = rand () % 10; // randomly picks a number

if(hareAction < 2){ // based on the hareAction chooses one of the if statements and preforms a math operation 
    harePosition = harePosition;
}
else if(hareAction > 1 && hareAction < 4){
    harePosition += 9;
}
else if(hareAction == 4){
    harePosition -= 12;
}
else if(hareAction > 4 && hareAction< 8){
    harePosition += 1;
}
else{
    harePosition -= 2;
}

if(harePosition < 1){ // Suppose to prevent the harePosition from being less than one
   return = 1;
}

return harePosition;

}

1 Ответ

0 голосов
/ 22 февраля 2019
int *harePosition = 1;

создаст указатель и установит его в ячейке памяти 1 (a) .Это не то, что вам нужно.

На самом деле абсолютно нет необходимости использовать указатели в вашем коде, поскольку вы передаете значение и возвращаете новое значение (b) .Итак, в более простой форме вам понадобится:

int fn (int someVal) {
    return someVal + 42;
}

int val = 7;
val = fn (val); // now it will be 49.

(a) По крайней мере, в системах, которые позволяют это.Я думаю, что это утверждение должно было генерировать, по крайней мере, какое-то диагностическое сообщение, поскольку, как указывает ISO C11 Simple assignment в его ограничениях, вы должны назначать только совместимый указатель или нулевой указатель, не какое-то произвольное целое число.


(b) Как правило, единственной причиной для передачи указателя является эмуляция передачи по ссылке на языке, который его не имеет.Я искренне надеюсь в какой-то момент, что ISO просто кусает пулю и добавляет real передачу по ссылке на язык.Тогда около 80% проблем с C исчезнут: -)

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

void fn (int *pSomeVal) {   // Receive a POINTER to an int.
    *pSomeVal += 42;        // Update the thing it points TO.
}

int val = 7;
fn (&val);                  // Pass POINTER to the int,
                            //   then val becomes 49.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...