2016-05-12 4 views
-4

У меня проблема с переменными bolded. CLion сказал, что эти параметры никогда не доступны.Как передать локальные переменные int в качестве параметров функции?

Когда я вызываю функцию open_turn, turn_face и turn_suit говорят, что они не были инициализированы. Но я не хочу инициализировать эти переменные, назначая им значения, поскольку значения определяются только после вызова функции.

Как передать Int turn_card, Int turn_f и INT turn_s в функцию open_turn? Затем назначая значение Int turn_card к ИНТ очередь, INT turn_f к Int turn_face и INT turn_s к turn_suit?

P/s: На данный момент параметры Int turn_f и INT turn_s называются быть объявлены, но никогда не обращались.

void open_turn(int current_deck[], int turn_card, int turn_f, int turn_s); 

int main() { 
    int turn; 
    int turn_face; 
    int turn_suit; 

open_turn(deck, turn, turn_face, turn_suit); 

} 

void open_turn(int current_deck[], int turn_card, int turn_f, int turn_s) { 
    turn_card = current_deck[card_idx++]; 
    turn_f = turn_card%13; 
    turn_s = turn_card/13; 
+0

Можете ли вы не связаны с выходом компилятора? –

+0

Где вы ___use___ переменные 'turn_s' и' turn_f'? –

+0

Если вы просто назначаете значения turn_s и turn_f в функции, зачем вам вообще передавать их? Или вы ожидаете, что они будут возвращены из функции, и в этом случае вам нужно будет передать указатели на int, а не int. – OldBoyCoder

ответ

0

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

#include <stdio.h> 
void f(int x, int *p) { 
    x = 0; /* This only affects local param x */ 
    *p = 5; /* copies x's value into variable pointed to by p */ 
} 

int main() { 
    int a = 1, b = 2; 
    f(a, &b); /* a passed by value, b's address is passed */ 
    printf("a = %d, b= %d\n", a, b); /* prints out a = 1, b = 5 */ 
} 

Здесь компилятор может предупреждать о том, что x переменная в функции f присваивается значение, которое не обращается к ней, не установив его на 0 уже не влияет на a в main. *p = 5 не создавал предупреждение, так как оно влияет на значение b, которое затем используется в вызове printf.

1

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

Обратите внимание, что у вас, вероятно, все еще есть ошибки в коде, так как вы не показали нам, как определено current_deck.


Листинг


/******************************************************************************* 
* Preprocessor directives. 
******************************************************************************/ 
#include <stdio.h> 


/******************************************************************************* 
* Function prototypes. 
******************************************************************************/ 
void open_turn(int current_deck[], int turn_card, int turn_f, int turn_s); 


/******************************************************************************* 
* Function definitions. 
******************************************************************************/ 
int main(void) 
{ 
    int turn; 
    int turn_face; 
    int turn_suit; 
    open_turn(deck, &turn, &turn_face, &turn_suit); 

    /* The following also works. */ 
    int* pTurn = &turn; 
    int* pTurn_face = &turn_face; 
    int* pTurn_suit = & turn_suit; 
    open_turn(deck, pTurn, pTurn_face, pTurn_suit); 

} 

void open_turn(int current_deck[], int* turn_card, int* turn_f, int* turn_s) 
{ 
    if (!turn_card || !turn_f || !turn_s) 
    { 
     printf("Invalid input.\n"); 
     return; 
    } 

    *turn_card = current_deck[card_idx++]; 
    *turn_f = turn_card%13; 
    *turn_s = turn_card/13; 
} 
+0

У меня не было проблем с массивом current_deck [], потому что массивы всегда рассматриваются как указатели при передаче функции в качестве параметра, верно? –

+0

@JasonBui [Не совсем.] (Https://stackoverflow.com/questions/12676402/why-cant-i-treat-an-array-like-a-pointer-in-c). Если вышеприведенный ответ разрешил вашу проблему, пожалуйста, подумайте о том, что это «принято». – DevNull

+0

Тогда почему мне не нужен указатель на массив? –

Смежные вопросы