Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
ramses
-2 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 55
#1

Проблема с extern-переменными - C++

12.06.2011, 12:00. Просмотров 2077. Ответов 14
Метки нет (Все метки)

Такие дела. У меня два файла, func.cpp и main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//func.cpp
double sum, count;
 
double average(double num) {
    sum += num;
    count++;
    return sum/count;
}
 
void reset() {
    sum = 0;
    count = 0;
}
 
//main.cpp
#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
extern double sum;
double average(double num);
void reset();
 
int _tmain() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char query[10];
        
    do {
        cout << "Введите число:";
        cin >> query;
        if (query[0] == 'r')
            reset();
        else if (!query)
            break;
        else {
            cout << "Сумма:" << sum << "\n";
            cout << "Среднее арифметическое:" << average(atof(query)) << "\n";
        }
    } while (true);
    
    _getch();
    
    return 0;
}
При попытке скомпилировать эти вещи выдаёт ошибку:
Error: Unresolved external '_sum' referenced from C:\DOCUMENTS AND SETTINGS\ADMIN\МОИ ДОКУМЕНТЫ\C++ SKETCHES\MAIN.OBJ

Что ему (Borland Free Compiler 5.5.1) не нравится? Те же яйца, только в профиль, если объявлять main() как не _tmain() (правда, при этом он ссылается на другой объектный файл). Либо я не понимаю принципов модульности в C++, либо компилятор писали весёлые люди. Только что-то не весело мне..

Добавлено через 3 минуты
Т.е. если попробывать скомпилировать такую программку

C++
1
int main() {}
, то выдаст

Error: Unresolved external '_wmain' referenced from C:\BORLAND\BCC55\LIB\C0X32W.OBJ
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2011, 12:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема с extern-переменными (C++):

Прога на Билдере 5.Проблема с динамическими переменными - C++
вылетает ошибка:Projest такой-то raised exception class EAccessViolation with message 'Access violation at adress 325032ce.Write of address...

extern - C++
Собственно как правильно пользоваться такой штукой? 1. Где нужно использовать: 1) только в заголовочном файле 2) только в исходном...

Extern в C/C++ - C++
Оговорка - собирал все под VS2015 и под него же с Clang'ом для убедительности. В первую очередь интересует актуальная для них информация,...

директива extern - C++
Никак н могу понять как решить проблму с директивой extern. Я подключил к проекту файл libext.h и попытался скомпилировать программу. И...

Extern template - C++
Не могу понять, в книге пишут: Примерно понимаю, при компиляции будет добавлен код определения шаблона в каждый файл где он...

что такое extern? - C++
что будет если не написать extern,если можно с примерами

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
12.06.2011, 12:02 #2
Цитата Сообщение от ramses Посмотреть сообщение
Либо я не понимаю принципов модульности в C++, либо компилятор писали весёлые люди. Только что-то не весело мне..
скорее всего ты не понимаешь для чего нужен extern
ramses
-2 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 55
12.06.2011, 12:07  [ТС] #3
По моим соображениям, extern передаёт копию глобальной переменной. То бишь, double sum из func.cpp должен передаться в файл main.cpp. Но этого не происходит..
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
12.06.2011, 12:16 #4
в VS 2008 компилируется. Но я бы на твоём месте пользовался бы заголовочными файлами
ramses
-2 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 55
12.06.2011, 12:20  [ТС] #5
Можешь схематично описать как пользоваться заголовочными файлами? Поскольку я этого не представляю, если честно..
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
12.06.2011, 12:25 #6
помести все объявления в func.h заинклудь его в main.cpp, определения функция в func.cpp брось. Обычно extern пользуются для межмодульного взаимодействия. И ругается у тебя линкер, а не компилятор
ramses
-2 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 55
12.06.2011, 12:28  [ТС] #7
Упс, затупил) Спасибо, работает.
Относительно extern'ов у меня правильное понимание?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.06.2011, 13:12 #8
ramses, extern используется если переменная функция определены где-то в другом модуле, а использовать надо в твоем. То есть указание компилятору, что эта переменная есть, но определена в другом месте.
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
12.06.2011, 15:02 #9
Цитата Сообщение от ramses Посмотреть сообщение
По моим соображениям, extern передаёт копию глобальной переменной. То бишь, double sum из func.cpp должен передаться в файл main.cpp. Но этого не происходит..
Неправильно, дядя Федор, бутерброд ешь...
extern ничего не передает. extern указывает компилятору, что эти переменные ГДЕ-ТО в программе объявлены и памяти для них в ДАННОМ модуле выделять не надо. Соответственно, при сборке линкер все склеит по своим местам.

Возможно, вы неправильно создали проект.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.06.2011, 15:13 #10
Тут более важная ошибка. Функция average вовсе не считает среднее арифметическое.)
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
12.06.2011, 15:31 #11
Deviaphan, ага. Цикла-то и нет...
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
12.06.2011, 15:45 #12
Ну почему же? Считает. И цикл есть, в главной функции организован.
По мере ввода чисел среднее пересчитывается. Только для надёжности можно было reset() перед циклом вызвать. И сумма выводится предыдущая, а не текущая, так как обновляется она во время очередного усреднения, а выводится до этого.
Название функции неудачно. Это скорее что-то вроде current_avarage() или какие там синонимы ещё можно подобрать...
А глобальные переменные — зло
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.06.2011, 16:25 #13
среднее для ряда 1, 2, 3.
(1+2+3)/3 = 2
У тебя
(((1+2)/2)+3)/3 = 1.5

Среднее - сумма всех членов делённое на их количество.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
12.06.2011, 16:41 #14
Это не так. Очередное число прибавляется не к предыдущему среднему, а к предыдущей сумме. Среднее считается правильно.
Цитата Сообщение от Deviaphan Посмотреть сообщение
Среднее - сумма всех членов делённое на их количество.
Так и есть. Смотри внимательнее.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.06.2011, 16:48 #15
Да, действительно.
Тогда остаётся только замечание по кривому проектированию.)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2011, 16:48
Привет! Вот еще темы с ответами:

Ключевое слово extern - C++
Есть код в файле file1.cpp #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &quot;file2.cpp&quot; int main() { ...

( extern char ) переопределение; - C++
Здравствуйте. В file.cpp использую: char *SOUND_TRAPPED = { &quot;zbm4/zombi_trapped.wav&quot;, // male ...

Зачем нужен extern? - C++
Знаю, что в интернете полно объяснений зачем он, но я не могу понять... Везде пишут, что он &quot;позволяет объявить переменную без её...

Использование extern с функциями - C++
Добрый вечер! Скажем я задекларировал в каком-то модуле функцию extern void foo() ;. Но не описал её. Могу ли я при подключении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.06.2011, 16:48
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru