Как я должен вызывать значение другой функции для оператора условия другой функции?

#c #cs50

Вопрос:

Я пытаюсь создать две функции и поместить их за пределы основной{ }.

Вопрос требует, чтобы пользователь ввел номер, который должен быть end_size > start_size > 9 .

А если нет, то просто подскажите это еще раз.

У меня есть два вопроса.

Вот первая проблема, в функции int get_start_size , в функции должно храниться значение int start_size . Тогда почему я не могу вызвать его из другой функции int get_end_size ?

 #include <cs50.h>
#include <stdio.h>

int get_start_size(void);
int get_end_size(void);


int main(void)
{

    int i = get_start_size();
    printf("%in", i);
    
    int j = get_end_size();
    printf("%in", j);
    
}


int get_start_size(void)
{
    
    int start_size;
    do
    {
        start_size = get_int("Start size is:");
        
    }
    while (start_size < 9);
    return start_size;
}


int get_end_size(void) 
{
    
    int end_size;
    
    do
    {
        end_size = get_int("End size is:");
        
    }
    while (end_size < start_size); //<<<<<<<<<<<<<this is the alert I got, use of undeclared identifier 'start_size'.
    return end_size;
}

 

И вторая проблема в том, что если я изменю его вот так:

 int get_end_size(void) 
{
    
    int end_size;
    int k =  get_start_size(); //<<<<<<<<<<<<< Should I call function like this?
    do
    {
        end_size = get_int("End size is:");
        
    }
    while (end_size < k); //this is the problem I got, how to use value "int s" from other function "int get_start_size(void)"?
    return end_size;

}
 

Результат будет таким:

 ~/lab/ $ ./population 
Start size is:10
10
Start size is:10 //duplicated prompt
End size is:22
22
~/lab/ $ 
 

Результат вполне соответствует моей цели, но я думаю, что вызвал функцию неправильно, потому что она просит пользователя ввести в два раза больший начальный размер. Как я должен это сделать вместо этого? Спасибо.

Комментарии:

1. while (start_size < 9); похоже на бесконечный цикл. Стандартный формат do/while цикла — запись } while(...); в одной строке.

Ответ №1:

Локальные переменные

Переменные, объявленные внутри функции или блока, называются локальными переменными. Они могут использоваться только операторами, находящимися внутри этой функции или блока кода. Локальные переменные неизвестны функциям, находящимся за пределами их собственных.

start_size не видно внутри get_end_size() , чтобы сделать его видимым, передайте значение в качестве параметра функции:

Прототип должен быть:

 int get_end_size(int start_size);
 

Для вашего второго фрагмента я понимаю, что вы хотите вернуть 2 значения из функции, вы можете добиться этого с помощью struct :

 struct size
{
   int start, end;
};

struct size get_size(void)
{
    struct size size = {0, 0};

    size.start = get_start_size();
    do
    {
        size.end = get_int("End size is:");
    }
    while (size.end < size.start);
    return size;
}
 

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

 void get_size(int *start, int *end)
{
    *start = get_start_size();
    do
    {
        *end = get_int("End size is:");
    }
    while (*end < *start);
}
 

вызовите его с main помощью:

 int start, end;

get_size(amp;start, amp;end);
 

Или вы можете передать массив:

 enum {START, END};

void get_size(int size[])
{
    size[START] = get_start_size();
    do
    {
        size[END] = get_int("End size is:");
    }
    while (size[END] < size[START]);
}
 

В этом случае main должно выглядеть так:

 int size[2];

get_size(size);