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

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

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

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

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

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

Огромная просьба помочь:
Написал программку для вывода в табличном виде значений заданной функции. Обязательное условие: расчёт через отдельную функцию и многофайловость проекта.
При компановке всего кода в один файл все прекрасно работало.
Далее разбил на 2 файла .срр и файл .h:
В заголовочный файл вставил все дерективы подпроцессора, инициализацию переменных и объявление функции ( double F (double) )
В остальных файлах вместо всех деректив и объявлений только подключение этого заголовочного файла.
В итоге при запуске выдается ошибка: "error lnk2005: "double a" уже определен в коде code1.obj" и далее так по всем переменным. Ошибку указывает в файле с функцией.

листинг файлов:
head.h
[CODE]
//Заголовочный файл
#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);
[CODE]
func.cpp
[CODE]
// функция рассчета F(x)

#include "head.h"

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

return y;
}
[CODE]
code1.cpp
[CODE]
// Исходный кд с функцией 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";
}
}
[CODE]

Последний раз редактировалось Faraon9; 11.12.2012 в 17:53.
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 17:29   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
В заголовочный файл вставил ... инициализацию переменных
Убрать в цпп
p51x вне форума Ответить с цитированием
Старый 11.12.2012, 17:32   #3
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

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

научитесь отличать объявление от инициализации
p51x вне форума Ответить с цитированием
Старый 11.12.2012, 19:02   #5
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
научитесь отличать объявление от инициализации
готов посыпать голову каким-нибудь пеплом. если можете- дайте ссылку на внятное обьяснение разницы и подскажите, наконец, как исправить программу
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 19:26   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

переменный в h обьявляем через extern
Код:
extern float d;
в cpp же пишем
Код:
float d=5.0;
как то так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.12.2012, 20:02   #7
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
переменный в h обьявляем через extern
Код:
extern float d;
в cpp же пишем
Код:
float d=5.0;
как то так.
Уважаемый Пепел!
поставил extern к трем постоянным (Хнач, Хкон и дх) и все равно ошибка:
идетификаторы а, х, у уже определены в осн.срр, если externставить ко всем переменным- ошибка: неразрешенные идентификаторы
Faraon9 вне форума Ответить с цитированием
Старый 11.12.2012, 20:12   #8
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, 21:57   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Привет, Faraon9

Видимо, вот эту строку:
Код:
double a, x, y;
Нужно заменить на эту:
Код:
extern double a, x, y;
Иван
8Observer8 вне форума Ответить с цитированием
Старый 11.12.2012, 22:45   #10
Faraon9
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Привет, Faraon9

Видимо, вот эту строку:
Код:
double a, x, y;
Нужно заменить на эту:
Код:
extern double a, x, y;
Иван
Иван, спасибо за совет.
но я это пробывал, и возникает проблема:все равно где-то в файлах должна быть строка без extern-а, как я понимаю попытка дбавить ее с code1.cpp приводит к тому, чт компилятор вообще отказывется работать и отправляет проверять его настройки.
Faraon9 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где найти исходники на Java( 1 проект - больше 1000 классов, 2 проект - больше 100, 3 проект - больше 10) Pti44ka Общие вопросы по Java, Java SE, Kotlin 2 09.09.2010 21:31
Проект на C# senokos Фриланс 8 11.03.2010 21:23
(C++) Многофайловый проект/раздельная компиляция Troi666 Помощь студентам 8 06.06.2009 23:59
Проект на C# Etlau Помощь студентам 1 07.04.2009 22:10