Установка одной переменной равной другой в C - PullRequest
1 голос
/ 25 марта 2020

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

Теперь, во всем мире, я хочу написать следующий код:

int killing_time = 20000;
int killing_period;
killing_period = killing_time;

Компилятор выдает мне следующие ошибки:

data definition has no type or storage class

Разве я не могу четко определить, что это целое число?

initializer element is not constant

Если я определю killing_time как const int killing_time = 20000, это все равно выдаст ту же ошибку :

type defaults to ‘int’ in declaration of ‘killing_period'

Конечно, я могу определить killing_period как 20000 и просто начать итерацию по этому вопросу, но я хочу знать, что происходит.

Я надеюсь, мы сможем понять это вместе.

Ответы [ 3 ]

1 голос
/ 25 марта 2020

killing_period = killing_time; не является допустимым оператором в глобальной области видимости.

Вы можете использовать присваивание при объявлении, но назначенная переменная (элемент инициализатора) должна быть постоянной:

const int killing_time = 20000;
int killing_period = killing_time;

В любом случае, вы не должны делать это так.

Существует несколько способов сделать это, один из них - передать адрес вашего итератора функции, в которой вы его используете, таким образом, изменения, внесенные в область действия функции, являются постоянными:

void f1(int* i){
    (*i)++;    //will increment i
}

void f2(int* i){
    (*i)++;    //will increment i
}

int main ()
{
    int i = 0;
    f1(&i);          //pass the address of i
    f2(&i);          //pass the address of i
    printf("%d", i); // i = 2

    return 0;
}
0 голосов
/ 25 марта 2020

killing_period = killing_time; - это исполняемый код, и вы просто не можете иметь исполняемый код вне функций.

И вы не можете сделать это:

int killing_time = 20000;
int killing_period = killing_time; // wrong

Поскольку это переменные области действия файла и, следовательно, есть stati c срок хранения . И переменные со сроком хранения stati c могут быть инициализированы только тем, что C называет константным выражением. 20000 выше является целочисленным константным выражением, но killing_time не является.

Простое исправление состоит в том, чтобы сделать что-то вроде этого:

#define KILLING_TIME 20000
...
int killing_time = KILLING_TIME;
int killing_period = KILLING_TIME;
0 голосов
/ 25 марта 2020

killing_period = killing_time; это ваша проблема. Это исполняемый оператор, который не разрешен в глобальном пространстве ... он должен быть внутри функции.

Все еще не уверен, что вы ищете, но поможет ли следующая информация?

int killing_time = 20000;
int killing_period = -1;     // negative if not yet set

int your_function(void)
{
    if ( killing_period < 0 ) {
         /* one-time initialization on the first call */
         killing_period = killing_time;
    }

    return killing_period;
}

Если вам нужно несколько функций, устанавливающих killing_period, лучше всего спрятать это в отдельной функции, предназначенной для тестирования и установки, или, возможно, в макросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...