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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2014, 21:57   #1
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию Ошибка линкера

Добрый вечер! Пишу parser, который состоит из 3х файлов: main.cpp, parser.cpp, parser.h. До недавнего времени было все в порядке, но вдруг почему-то перестало компилироваться и компилятор выдает ошибки линкера:
parser.obj : error LNK2001: unresolved external symbol "private: void __thiscall parser::serror(enum parser::errorsT)" (?serror@parser@@AAEXW4errorsT@1@@Z )
1>parser.obj : error LNK2001: unresolved external symbol "private: void __thiscall parser::get_token(void)" (?get_token@parser@@AAEXXZ)
1>parser.obj : error LNK2001: unresolved external symbol "private: void __thiscall parser::eval_exp3(double &)" (?eval_exp3@parser@@AAEXAAN@Z)
1>

main

Код:
#include "parser.h"

void main(){

	cout << "Hello!";
	cin.get();
}
parser.h

Код:
#include <iostream>
#include <cctype>
#include <cstring>

using namespace std;

class parser{
	enum typesT { UNDEFTOK, OPERATOR, NUMBER };
	enum errorsT { SERROR, PARENS, NOEXP, DIVZERO };
	
	char *exp_ptr;
	char token[80];
	typesT tok_type;

	void eval_exp2(double&);
	void eval_exp3(double&);
	void eval_exp4(double&);
	void eval_exp5(double&);
	void eval_exp6(double&);
	void atom(double&);
	void get_token();
	void serror(errorsT);
	bool isdelim(char);
	
public:
	parser();
	double val_exp(char*);
};
parser.cpp

Код:
#include "parser.h"


parser::parser()
{
	exp_ptr = 0;
}

double parser::val_exp(char *exp){
	double result;

	exp_ptr = exp;

	get_token();
	if(!*token){
		serror(NOEXP);
		return 0.0;
	}
	eval_exp2(result);
	if(*token) serror(SERROR);
	return result;
} 

void parser::eval_exp2(double &result){
	register char op;
	double temp;

	eval_exp3(result);
	while((op = *token)=='+'||op == '-'){
		get_token();
		eval_exp3(temp);
		switch(op){
			case '-':
				result = result - temp;
				break;
			case '+':
				result = result + temp;
				break;
		}
	}
}
Подскажите плиз,с чем связанно!
Denis_nn вне форума Ответить с цитированием
Старый 25.08.2014, 22:12   #2
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию

Кто нибудь кроме меня уже готов дать правельный ответ?
Denis_nn вне форума Ответить с цитированием
Старый 25.08.2014, 22:51   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А какой правильный ответ то?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2014, 23:03   #4
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию

Он в ошибке! Надо определить все задействованные функции, которые в класе прописанны, тогда нормально компилируется.
Denis_nn вне форума Ответить с цитированием
Старый 25.08.2014, 23:04   #5
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию

parser::serror
parser::get_token
parser::eval_exp3
Denis_nn вне форума Ответить с цитированием
Старый 25.08.2014, 23:20   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Надо определить все задействованные функции, которые в класе прописанны, тогда нормально компилируется.
Если не хочешь определять то сделай их виртуальными или абстрактными. Тогда и тела не потребуются для этого класса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.08.2014, 06:24   #7
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию

Спасибо,мне пока не надо.
Denis_nn вне форума Ответить с цитированием
Старый 26.08.2014, 08:14   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Он в ошибке! Надо определить все задействованные функции, которые в класе прописанны, тогда нормально компилируется.
Ну решить то проблему по-разному можно, удалить неопределенные функции например.

Цитата:
parser::serror
parser::get_token
parser::eval_exp3
А еще:
Код:
void eval_exp4(double&);
	void eval_exp5(double&);
	void eval_exp6(double&);
	void atom(double&);
	bool isdelim(char);
Вцелом код унылый, непонятно что он делает. Имя exp5 мне ни о чем не говорит. Это неправильно.
rrrFer вне форума Ответить с цитированием
Старый 26.08.2014, 20:42   #9
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Ну решить то проблему по-разному можно, удалить неопределенные функции например.



А еще:
Код:
void eval_exp4(double&);
	void eval_exp5(double&);
	void eval_exp6(double&);
	void atom(double&);
	bool isdelim(char);
Вцелом код унылый, непонятно что он делает. Имя exp5 мне ни о чем не говорит. Это неправильно.
Ипать! Я так и знал, что найдется хотябы один!))))Ну а кудаж без вас на форумах!))) Ты вообще учишся или работаешь? Ты видимо еще не в курсе,что такое непонятный код! А здесь все понятно даже из названия файлов, плюс номера у функций(явно иерархия операций), плюс нисходящая рекурсия, плюс функция, которая ищет разделители isdelim (разделитель?Истин,Ложь), плюс функция преобразования значений! Хм... наверное это анализатор выражений! Херб Шильдт Фридман. C++ архив программ, глава 13 Объектно ориентированный анализатор выражений, стр.483. Если уж он непонятно пишет, не легко тебе видимо приходится!)))
Denis_nn вне форума Ответить с цитированием
Старый 27.08.2014, 05:20   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
плюс функция преобразования значений! Хм... наверное это анализатор выражений
И комментарии (не в коде) тоже ни о чем.
Любая функция, по определению, - преобразовывает значения (аргумент в значение).

Цитата:
плюс номера у функций(явно иерархия операций),
номера у функций? - типа это правильно.

Цитата:
ерб Шильдт Фридман. C++ архив программ, глава 13 Объектно ориентированный анализатор выражений, стр.483. Если уж он непонятно пишет, не легко тебе видимо приходится!)))
Я не читал эти ваши книги, не знаю насколько понятно они написаны. Знаю что в вашем посте говнокод. get_token (с оговорками), isdelim, atom - окей, хорошо (что внутри мы не видели, но догадываемся). eval_exp6 - дерьмо.

Код:
while((op = *token)=='+'||op == '-'){
		get_token();
Я не видел что там делает get_token, но почти уверен что в этом случае он смещает указатель на следующий за звездочкой символ. Из названия он должен ВОЗВРЩАТЬ ТОКЕН, а возвращает void.

Цитата:
(op = *token)=='+'||op == '-'
Может быть ошибаюсь (надо в стандарт заглянуть), но
Оператор || вроде как не устанавливает точку следования, а значит теоретически (на каком-то компиляторе) может сначала выполнится op == '-', а уже потом (op = *token)=='+'.
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема линкера "ссылка на неразрешенный внешний символ" denrubun Общие вопросы C/C++ 4 26.02.2013 14:12
Ошибка линкера Denis_nn Общие вопросы C/C++ 4 18.07.2012 19:00
ошибка линкера: indefined reference to 'EnumPrintersW@28' agronomchek Помощь студентам 5 04.03.2012 16:38
Ошибка линкера: error LNK2001: unresolved external symbol _WinMain@16 krugolet Visual C++ 4 02.01.2012 23:03
Опция линкера /NODEFAULTLIB kot111 Общие вопросы .NET 9 30.12.2007 18:22