Консультация № 196375
15.09.2019, 20:49
0.00 руб.
08.10.2019, 11:41
0 5 2
здрасте. подскажите где ошибка

Код:
#include <stdio.h>

int ror(int i)
{
extern int i;

return 0;
}

int main(int)
{
int i = 5;

printf("i %d\r\n", ror(i));

printf("HELLO WORLD!\r\n");

return 0;
}

пожалуйста

Обсуждение

давно
Старший Модератор
312929
1973
16.09.2019, 05:33
общий
Адресаты:
А в чём здесь, по Вашему, ошибка? И что должна делать программа?
давно
Студент
402651
154
16.09.2019, 06:59
общий
это ответ
Здравствуйте, 89285189543rex!
Вот что получим
i 0
HELLO WORLD!
давно
Посетитель
403261
3
16.09.2019, 07:50
общий
мне говорили что с помошью ключевого слово extern можно сделать переменные видимыми в других функциях.
давно
Студент
402651
154
16.09.2019, 09:24
общий
Адресаты:
Тогда так

#include <stdio.h>

int ror()
{
extern int i;
return 0;
}

int main()
{
int i = 5;
printf("i %d\r\n", ror(i));
printf("HELLO WORLD!\r\n");
return 0;
}

Результат тот-же, но переменная i глобальная...
Вот еще немного теории:

extern

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

Таблица. Использование глобальных переменных в раздельно компилируемых файлах
Файл 1 Файл 2
int х, у; extern int x, y;
char ch; extern char ch;

main(void) void func22(void)
{ {
... х= у/ 10;
} }

void func1 (void) void func23(void)
{ {
x = 23; y=10;
} }

В файле 2 список глобальных переменных копируется из файла 1 и при объявлении добавляется спецификатор extern. Спецификатор extern сообщает компилятору, что следующие за ним типы и имена переменных объявляются где-то в другом месте. Другими словами, extern позволяет компилятору знать о типах и именах глобальных переменных без действительного создания этих переменных. Когда два модуля объединяются, все ссылки на внешние переменные пересматриваются.

Если при объявлении выделяется память под переменную, то процесс называется определением. Использование extern приводит к объявлению, но не к определению. Оно просто говорит компилятору, что определение происходит где-то в другом месте программы.

Имеется другой вариант использования extern. Когда используется глобальная переменная внутри функции, находящейся в том же файле, где происходит объявление глобальной переменной, то можно объявлять ее как extern, хотя делать это не обязательно. Следующий фрагмент программы демонстрирует, как использовать данный вариант.

int first, last; /*глобальное определение first и last */
int main (void)
{
extern int first; /* необязательное использование extern объявления */
......
}

Хотя объявление переменной с extern может иметь место в одном файле с объявлением глобальной переменной, в этом на самом деле нет необходимости. Если компилятор С встречает переменную, которая не была объявлена, то компилятор проверяет, соответствует ли она какой-либо глобальной переменной. Если это так, то компилятор предполагает, что эта переменная ссылается на глобальную.
давно
Советник
400484
472
16.09.2019, 11:11
общий
это ответ
Здравствуйте, 89285189543rex!
Ошибок в коде нет. При компиляции есть предупреждения.
Код:

// Example program
#include <stdio.h>

int ror(int i)
{
extern int i; // warning: unused variable 'i' - это говорит о том, что переменная не используется

return 0;
}

int main(int) // warning: 'int main(int)' takes only zero or two arguments (int main (int) 'принимает только ноль или два аргумента)
{
int i = 5;

printf("i %d\r\n", ror(i));

printf("HELLO WORLD!\r\n");

return 0;
}


В этом коде присутствуют проблемы:
Код:

int ror(int i)
{
extern int i;

return 0;
}

1. Две переменных имеют одно и тоже имя i. Они друг друга перекрывают.
2. В функции ни чего не делается с переменными.
3. extern - это ключевое слова для объявления переменой глобальной. Зачем? (почитать можно тут)

Функция main в таком виде не используется. Почитать можно тут.

Зачем используется функция ror(i)? Она все время возвращает 0.

Чтобы сделать переменную extern int i глобальной ее нужно вынести за пределы функции. И даль глобальное имя, например, extern int global.
Код:

#include <stdio.h>

extern int global = 100;

int ror(int i)
{
int iTemp = global - i;

return iTemp;
}

int main()
{
int i = 5;

printf("i %d\r\n", ror(i));

printf("HELLO WORLD!\r\n");

return 0;
}

Вот пример более осмысленного кода.
Форма ответа