Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 18:16   #1
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию Проблема с обьявлением идентификаторов в С++

Огромная просьба помочь:
Написал программку для вывода в табличном виде значений заданной функции. Обязательное условие: расчёт через отдельную функцию и многофайловость проекта.
При компановке всего кода в один файл все прекрасно работало.
Далее разбил на 2 файла .срр и файл .h:
В заголовочный файл вставил все дерективы подпроцессора, и объявление функции ( double F (double) )
В остальных файлах вместо всех деректив только подключение этого заголовочного файла и объявление переменных в основном файле.
В итоге при запуске выдается ошибка:
"Ошибка 1 error
C2065: a: необъявленный идентификатор
d:\c++\lab1ttp\osnoma\func.cpp 7"
и также для переменной "y"


листинг файлов:
head.h
Код:
//Заголовочный файл
#include <iostream>
#include <locale>
#include <math.h>

using namespace std;

double a, x, y, Xstart=10.00, Xend=19.00, dx=1.50; // Инициализация переменных
double F(double);
func.cpp
Код:
// функция рассчета F(x)

#include "head.h"

double F(double y) //Обьявление финкции F(x)
{
y=0.7*(3*a*x+1/(a*log10(x))); 

return y;
}
code1.cpp
Код:
// Исходный кд с функцией mail и условием задачи:
// задана функция y=0,7(3ax+1/a*lnx) Xнач10, Xкон=19, dX 1.5
// Вычислить таблицу значений функции y=F(x) для значений аргумента x,
// изменяющегося в интервале от Xнач до Xкон c шагом dx.
// Для вычисления функции использовать собственную функцию,
// т.е. ввести функцию пользователя F(x).

#include "head.h"

void main ()
{
setlocale (LC_ALL,"Russian");// подключение вывода русского языка
cout << "Для рассчета функции вида y=0,7(3ax+1/a*lnx) введите перемнную а: \n";
cin >> a;
cout << "\tx\t|y=F(x)\n"; 
for(x=Xstart; x<=Xend; x++)
{
F(y);
cout <<"\t"<< x <<"\t|"<<y<<"\n";
}
}
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 18:20   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Почитайте про "стражей включения".

А вообще, за такие приколы...
Код:
double F(double y) //Обьявление финкции F(x)
{
y=0.7*(3*a*x+1/(a*log10(x))); 
return y;
}
...убивать надо. Из рогатки.
Abstraction вне форума Ответить с цитированием
Старый 11.12.2012, 18:27   #3
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Почитайте про "стражей включения".

А вообще, за такие приколы...
Код:
double F(double y) //Обьявление финкции F(x)
{
y=0.7*(3*a*x+1/(a*log10(x))); 
return y;
}
...убивать надо. Из рогатки.
спасибо за ответ, уважаемый Abstraction, но можно по-конкретнее и понятнее пояснить?
я на звание "папки" не прендую - поэтому обратился сюда.
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 18:45   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

http://programmersforum.ru/showthread.php?t=221275
p51x вне форума Ответить с цитированием
Старый 11.12.2012, 20:09   #5
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

все же, огомная просьба указать на ошибки:
head.h
Код:
#ifndef _HEAD_H 
#define _HEAD_H
#include <iostream>
#include <locale>
#include <math.h>

using namespace std;

	double a, x, y;
	extern double Xstart;
	extern double Xend;
	extern double dx;
double F(double);

 
#endif
func.cpp
Код:
#include "head.h"

double F(double y)
{
	y=0.7*(3*a*x+1/(a*log10(x))); 
	
	return y;
}
code1.cpp
Код:
#include "head.h"

	
	double Xstart=10.00, Xend=19.00, dx=1.50;
void main ()
{  
		setlocale (LC_ALL,"Russian");
	cout << "Для рассчета функции вида y=0,7(3ax+1/a*lnx) введите перемнную а: \n";
	cin >> a;
	cout << "\tx\t|y=F(x)\n"; 
	for(x=Xstart; x<=Xend; x++)
		{
			 F(y);
			cout <<"\t"<< x <<"\t|"<<y<<"\n";
	    }
}
при запуске выдатся ошибки:
Ошибка 1 error LNK2005: "double a" (?a@@3NA) уже определен в code1.obj D:\C++\LAB1ttp\osnoma\func.obj
Ошибка 2 error LNK2005: "double x" (?x@@3NA) уже определен в code1.obj D:\C++\LAB1ttp\osnoma\func.obj
Ошибка 3 error LNK2005: "double y" (?y@@3NA) уже определен в code1.obj D:\C++\LAB1ttp\osnoma\func.obj


При этом если все собирать в один файл- все работает без ошибок.
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 20:18   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

a, x, y не особееные, екстерн к ним

П.С. Модеры убейте уже одну из тем...
p51x вне форума Ответить с цитированием
Старый 11.12.2012, 20:27   #7
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
a, x, y не особееные, екстерн к ним

П.С. Модеры убейте уже одну из тем...
При добавлении екстерна к а, х, у выходят ошибки: неразрешенный внешний символ а, х, у в обоих .срр файлах.
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 22:59   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Ошибка 1 error LNK2005: "double a" (?a@@3NA) уже определен в code1.obj D:\C++\LAB1ttp\osnoma\func.obj
Краткий ответ: в заголовочном файле, который включается в более чем один .cpp-файл (читай: в любом заголовочном файле) нельзя определять переменные. Грубо говоря, компилятор сначала скомпилировал func.cpp, зарезервировал 8 байт под переменную a; потом скомпилировал code1.cpp, зарезервировал 8 байт под переменную a в другом месте. Потом компоновщик попытался собрать это воедино, увидел, что переменная a раздвоилась и с воплем "а-а-а!" убежал в закат.

Первый, неправильный вариант лечения: объявить переменные в h-файле с использованием ключевого слова extern и определить в некотором .cpp-файле. Так у Вас сделано, к примеру, в отношении переменной dx.

Второй, правильный вариант: не использовать неконстантные глобальные переменные, в этой программе в них нет нужды.
Abstraction вне форума Ответить с цитированием
Старый 11.12.2012, 23:24   #9
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Краткий ответ: в заголовочном файле, который включается в более чем один .cpp-файл (читай: в любом заголовочном файле) нельзя определять переменные. Грубо говоря, компилятор сначала скомпилировал func.cpp, зарезервировал 8 байт под переменную a; потом скомпилировал code1.cpp, зарезервировал 8 байт под переменную a в другом месте. Потом компоновщик попытался собрать это воедино, увидел, что переменная a раздвоилась и с воплем "а-а-а!" убежал в закат.

Первый, неправильный вариант лечения: объявить переменные в h-файле с использованием ключевого слова extern и определить в некотором .cpp-файле. Так у Вас сделано, к примеру, в отношении переменной dx.

Второй, правильный вариант: не использовать неконстантные глобальные переменные, в этой программе в них нет нужды.
Сасибо за ответ.попробовал перекраить все, перенеся переменные в func.cpp, запрашиваю переменную "а" там же, но тогда как построить цикл в code1.cpp?
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 23:43   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Не использовать глобальные переменные. То есть, функция F должна использовать только те переменные, которые передаются ей в качестве аргументов, плюс те, которые объявлены внутри неё самой (локальные переменные).
F при этом должна стать функцией от двух аргументов, обратите внимание.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск дубликатов/повторов идентификаторов в файлах проекта phomm Общие вопросы Delphi 12 09.09.2014 06:50
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Организация таблиц идентификаторов Artemka89 Общие вопросы C/C++ 0 17.05.2010 01:07
Организация таблицы идентификаторов freez89 Помощь студентам 1 06.04.2010 00:46
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37