2014-09-05 3 views
0

Хорошо, я смущен языком C.
Мне нужно сделать функцию, которая получает номер от пользователя и отправляет его на несколько других функций (зависит от того, какой из них работает).
Без него эти функции выглядят как этотКак передать это число между функциями? C

void deflator(FILE** fw_vystup) { 
    float ipd, n_hdp = 0.0f, r_hdp = 0.0f; 
    do { 
     printf("Type in a GDP: "); 
     if (1 != scanf("%f", &n_hdp)) { 
      vyprazdni_buffer(); // this is just cleaning the buffer 
      continue; 
     } 
    } while (n_hdp <= 0); 
    ... 

Так что я сделал это, как этот

void zadani_cisla(float cislo) { 
    do { 
     printf("Wrong input!"); 
     if (1 != scanf("%f", &cislo)) { 
      vyprazdni_buffer(); 
     } 
    } while (cislo <= 0); 
} 
void deflator(float cislo, FILE** fw_vystup) { 
    float ipd, n_hdp = 0.0f, r_hdp = 0.0f; 
    do { 
     printf("Zadejte nominalni domaci produkt daneho roku: "); 
     zadani_cisla(cislo); 
     n_hdp = cislo; 

    } while (n_hdp <= 0); 

И еще говорят неправильно вход, потому что число я печатаю не получается, я думаю. Вы видите проблему? Заранее спасибо.

+0

Пожалуйста, используйте английский ищет строки и идентификаторов! –

+0

@BasileStarynkevitch: Зачем ему это делать? Он должен использовать имена идентификаторов, с которыми ему удобно. –

+0

Потому что код - это сообщение читателям SO, и мы читаем этот форум на английском языке! (но я не являюсь носителем английского языка). –

ответ

2

Вы не передаете свой номер по ссылке. Например, вы должны изменить следующее в функции deflator:

zadani_cisla(cislo); 

к

zadani_cisla(&cislo); /* pass by reference */ 

Таким образом любые изменили в этой переменной внутри функции zadani_cisla будет видно в deflator

Также в пределах zadani_cisla вам понадобится изменить следующую строку:

if (1 != scanf("%f", &cislo)) { 
     vyprazdni_buffer(); 
    } 

в

if (1 != scanf("%f", cislo)) { 
     vyprazdni_buffer(); 
    } 

как переменной cisla уже переменная указатель. Вам нужно будет изменить определение zadani_cisla слишком

1

В этом цикле:

void zadani_cisla (float cislo) 
{ 
    do { 
     printf("Wrong input!"); 
     if (1 != scanf("%f", &cislo)) { 
      vyprazdni_buffer(); 
     } 
    } while (cislo <= 0); 
} 

Printf всегда будет по крайней мере один раз. Ваша вторая проблема заключается в том, что поплавки передаются по значению в C, поэтому zadani_cisla не может изменить cislo в функции, которая его вызывает.

Лучше:

void zadani_cisla (float * cislo) 
{ 
    do { 
     if ((1 == scanf("%f", cislo)) && (*cislo > 0)) break; 
     vyprazdni_buffer(); 
     printf("Wrong input!"); 
    } while (1); 
} 

zadani_cisla(&cislo); 
0

Вы могли бы иметь функцию возвращения некоторые поплавок:

float ask_float(void) { 
    float f = 0.0; 
    do { 
    if (scanf("%f", &f)<=0) 
     printf("wrong float:\n"); 
    else return f; 
    } while(true); 
} 

Что бы вы использовать как:

float f; 
f= ask_float(); 

Или вы могли бы передать указатель:

void do_ask_float (float*pf) { 
    do 
    if (scanf("%f", pf)<=0) 
     printf("wrong float:\n"); 
    else return; 
    } while(true); 
} 

и вы могли бы назвать его как:

float f =0.0; 
do_ask_float(&f); 
Смежные вопросы