Intereting Posts
Как заставить GDB выйти из цикла? Почему компилятор показывает ошибку «ожидаемое выражение перед шпилькой»? Начало работы с SSE Связанный список, содержащий простые числа от 1 до 1000 Что может привести к сбою закрытия (2) с помощью EIO для файла только для чтения? Выключение оптимизации для конкретной функции в gcc 4.2.2 Функция чтения файла () в Unix Systems Является ли составным, если проверка на null, а затем другое условие в C всегда безопасно? В любом случае, чтобы быстро сломать слово в массив символов в объективе c? Спящие функции спят все темы или только тот, кто его называет? Как использовать язык программирования C, создающий оболочку, которая может реализовать историю захвата стрелки? Выполните инструкции по сборке gdb вместо C Освобождение строк в C Может ли компилятор автоматически определять чистые функции без информации о типе? Чтение одних и тех же данных из stdin несколько раз в C

Обновить (int) переменную в C внутри функции

Я пытаюсь написать функцию, которая меняет экран в моей простой игре C змеи.

main(){ int stage = 0; ... .. . while(stage!=0){ //if snake hits wall changeStage(stage); } } 

функция:

 void changeStage(int stage){ stage = 1; } 

Этот код не обновляет код, он будет продолжать работать. Что не так с моим кодом?

stage передается по значению для changeStage . stage = 1 изменяет только локальное значение stage в changeStage , а не значение main stage . Вместо этого вам нужно передать указатель:

 while (stage != 0) { changeStage(&stage); } void changeStage(int *stage) { *stage = 1; } 

C – это пароль по значению. Самый простой способ выполнить то, что вы хотите, это передать ссылку на переменную, которую нужно изменить. Например:

 void changeStage(int *stage){ *stage = 1; } main(){ int score = 0; int stage = 0; ... .. . while(stage!=0){ //if snake hits wall changeStage(&stage); } } в void changeStage(int *stage){ *stage = 1; } main(){ int score = 0; int stage = 0; ... .. . while(stage!=0){ //if snake hits wall changeStage(&stage); } } 

Примечание. Возможно, вам нужно будет прочитать указатели, чтобы полностью понять код, если вы только начинаете с программирования на языке C. В примере кода вместо передачи значения «stage» вы передаете место, где хранится значение «stage». Затем функция может изменить содержимое в местоположении.

Аргументы функции C являются передаваемыми по значению. Это означает, что вместо передачи ссылки на stage вы передаете значение, хранящееся в нем. Обновление, которое вы выполняете в функции changeStage применяется только к копии, которая была сделана.

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

 void changeStage(int* stage_p){ *stage_p = 1; } int main() { //... while(stage!=0){ //if snake hits wall changeStage(&stage); } } в void changeStage(int* stage_p){ *stage_p = 1; } int main() { //... while(stage!=0){ //if snake hits wall changeStage(&stage); } } 

&stage говорит, чтобы взять адрес stage и передать это функции. Аргумент stage_p затем укажет на int в главном.

*stage_p заставляет использовать значение, указанное на stage_p , которое является основным в вашем случае.

дальнейшее чтение

Вы не изменяете исходную переменную stage , а только changeStage локальную копию внутри функции changeStage .

Вам нужно использовать указатель:

 void changeStage(int* stage) { *stage = 1; } 

используя функцию:

 while (stage != 0) { // if snake hits wall changeStage(&stage); } 

Вам нужно узнать более основные понятия языка C. Указатель – очень важная функция на языке C.

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

 static int stage = 0; void changeStage(){ stage = 1; } main(){ int score = 0; ... .. . while(stage!=0){ //if snake hits wall changeStage(); } } в static int stage = 0; void changeStage(){ stage = 1; } main(){ int score = 0; ... .. . while(stage!=0){ //if snake hits wall changeStage(); } }