LINUX.ORG.RU

Сообщения Aswed

 

Какая-то фигня с виртуальными методами

Всем привет, у меня проблема с компиляцией плюсов. Ниже код и инофрмация об ошибке. Подскажите в чем проблема. Кроме того я нуб в ООП в плюсах, так что если что-то здесь можно переписать идеологически правильнее, скажите и об этом. lex.cpp:

#include "lex.h"
#include <cstring>
#include <list>

struct Ans {
	bool fin;
	bool err;
	int state;
};

static inline Ans newAns(bool f, int s){
	Ans a;
	a.fin = f;
	a.err = 0;
	a.state = s;
	return a;
}

static inline Ans newErr(){
	Ans a;
	a.fin = 0;
	a.err = 1;
	a.state = 0;
	return a;
}

#define ISLITS(c) (c >= 'a' && c <= 'z')
#define ISLITB(c) (c >= 'A' && c <= 'Z')
#define ISNUM(c)  (c >= '0' && c <= '9')

class Automat {
	protected:
		virtual Ans nextSymbol(char c);
	public:
		int len = 0;
		int ltype = L_NONE;
		int state = 0;
		bool fin = 0;
		bool err = 0;
		std::string text;
		bool next(char c){
			Ans a = this -> nextSymbol(c);
			this -> err = a.err;
			if (! this -> err) {
				this -> fin = a.fin;
				this -> state = a.state;
				this -> len ++;
				this -> text += c;
			}
			return ! a.err;
		}
};

class Aint : public virtual Automat {
	protected:
		virtual Ans nextSymbol(char c){
			if (c >= '0' && c <= '9')
				return newAns(1,0);
			return newErr();
		}
	public:
		Aint(){
			this -> ltype = L_INT;
		}
};

class Areal : public Automat {
	protected:
		virtual Ans nextSymbol(char c){
			switch(this -> state){
				case 0:
					if (ISNUM(c))
						return newAns(0,1);
					return newErr();
				case 1:
					if (ISNUM(c))
						return newAns(0,1);
					if (c == '.')
						return newAns(0,2);
					return newErr();
				case 2:
					if (ISNUM(c))
						return newAns(1,2);
					return newErr();
				default:
					return newErr();
			}
		}
	public:
		Areal(){
			this -> ltype = L_REAL;
		}
};

class Astr : public Automat {
	protected:
		virtual Ans nextSymbol(char c){
			switch(this -> state){
				case 0:
					if (c == '"')
						return newAns(0,1);
					return newErr();
				case 1:
					if (c == '"')
						return newAns(1,2);
					return newAns(0,1);
				default:
					return newErr();
			}
		}
	public:
		Astr(){
			this -> ltype = L_STR;
		}
};

class Aid : public Automat {
	protected:
		virtual Ans nextSymbol(char c){
			switch(this -> state){
				case 0:
					if (ISLITS(c) || ISLITB(c) || c == '_')
						return newAns(1,1);
					return newErr();
				case 1:
					if (ISLITS(c) || ISLITB(c) || ISNUM(c) || c == '_')
						return newAns(1,1);
					return newErr();
				default:
					return newErr();
			}
		}
	public:
		Aid(){
			this -> ltype = L_ID;
		}
};

class Abr : public Automat {
	protected:
		virtual Ans nextSymbol(char c){
			static const char brackets[] = "()[]{};.,";
			static int len = 0;
			if (len == 0)
				len = strlen(brackets);
			if (this -> state == 0){
				for(int i=0; i<len; ++i)
					if(brackets[i] == c)
						return newAns(1,1);
			}
			return newErr();
		}
	public:
		Abr(){
			this -> ltype = L_BR;
		}
};

class Aop : public Automat {
	protected:
		virtual Ans nextSymbol(char c){
			static const char symbols[] = "+-*/%^&|<>=!\\:#@";
			static int len = 0;
			if (len == 0)
				len = strlen(symbols);
			for(int i=0; i<len; ++i){
				if(symbols[i] == c)
					return newAns(1,1);
			}
			return newErr();
		}
	public:
		Aop(){
			this -> ltype = L_OP;
		}
};

using namespace std;

static int skipSpaces(string& str, int pos){
	for(;pos < str.length(); ++pos){
		char c = str[pos];
		if(c != ' ' && c != '\n' && c != '\r' && c != '\t')
			return pos;
	}
	return pos;
}

// is success new str pos will be written to 'spos'
bool lex(string& src, int& spos, string& dst, int& ltype){
	// skip space
	int pos = skipSpaces(src,spos);
	// init alist
	list<Automat> alist;
	alist.push_back(Aint());
	alist.push_back(Areal());
	alist.push_back(Astr());
	alist.push_back(Aop());
	alist.push_back(Abr());
	alist.push_back(Aid());
	alist.push_back(Aint());
	// search
	for(;pos < src.length(); pos++){
		bool flag = 0;
		for(auto& atm : alist)
			flag = flag || atm.next(src[pos]);
		if(flag)
			alist.remove_if([](Automat& atm){return atm.err;});
		else
			break;
	}
	// finalize
	for(auto& atm : alist){
		if(atm.fin){
			dst = atm.text;
			ltype = atm.ltype;
			spos = pos;
			return true;
		}
	}
	// if err
	return false;
}
main.cpp:
#include "lex.h"
#include <iostream>

using namespace std;

int main(){
	string text = "\thello world  12 g1 42 \n 12.2 \"dd\" += () 4";
	string dst;
	int ltype;
	int pos = 0;
	while(lex(text,pos,dst,ltype)){
		cout << "'" << dst << "' " << ltype << "\n";
	}
	cout << "end\n";
	return 0;
}
собираю так
g++ -c -std=c++0x -O2 lex.cpp
g++ -c -std=c++0x -O2 main.cpp
g++ -std=c++0x -o main -O2 lex.o main.o
Undefined symbols for architecture x86_64:
  "typeinfo for Automat", referenced from:
      typeinfo for Aid in lex.o
      typeinfo for Abr in lex.o
      typeinfo for Aop in lex.o
      typeinfo for Astr in lex.o
      typeinfo for Areal in lex.o
      typeinfo for Aint in lex.o
  "vtable for Automat", referenced from:
      lex(std::string&, int&, std::string&, int&) in lex.o
      std::list<Automat, std::allocator<Automat> >::_M_create_node(Automat const&) in lex.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

 , ,

Aswed
()

ubuntu 14.04 проблемы с раскладкой

Здравствуйте. Я обновился с 12.04 LTS на 14.04 LTS и теперь при включении или выхода из ждущего режима, в окне ввода пароля не работает переключение раскладки хоткеями. Переключение мышкой работает. После загрузки все работает нормально.

 ,

Aswed
()

Пересечение невыпуклых многоугольников

Здравствуйте, у меня вот задача. Есть два невыпуклых многоугольника и мне нужно убедится, что один из многоугольников на 80% располагается внутри другого многоугольника. Как это можно вычислить? Мне что-то ничего толкового в голову не приходит.

 

Aswed
()

Туториал по нейронным сетям

Здравствуйте, я тут пытаюсь научиться писать нейросети(just for lulz), но дальше однослойной распознавалки ничего не получается. Будте добры, поделитесь ссылкой на какие-нибудь годные уроки по созданию и обучению нейронных сетей. Желательно побольше примеров.

 ,

Aswed
()

Haskell C FFI

Всем привет, у меня вопрос по FFI в хаскеле. В окамле имеется очень удобная библиотека для C для обеспечения работы с камловской машиной. В стандартном наборе камла идут хидеры callback.h, mlvalues.h, alloc.h, и т.д. Там можно и с камловскими структурами из С работать и каллбеки и использовать камловский сборщик мусора. Есть ли подобная вещь для хаскеля и где можно было бы про нее почитать?

 , ,

Aswed
()

python класс в строку

Скажите, какой метод нужно добавить в класс, что бы интерпретатор использовал его при автоприведении к строковому типу? Например у меня есть класс А и я хочу что бы при вызове

print [A(1),A(2),A(3)]
интерпретатор выводил не
[<__main__.A instance at 0x0000>,<__main__.A instance at 0x0000>,<__main__.A instance at 0x0000>]
а использовал мой метод. С методом __str__ это не работает. P.S. python 2.7

 

Aswed
()

Трансляция в LLVM

Я люблю иногда, забавы ради, написать свой интерпретатор/компилятор какой-нибудь несложной хурмы. И мне хочется попробовать транслировать что-нибудь в LLVM, но я не могу найти годного мануала о том, как с LLVM работать. Если здесь есть кто-нибудь, кто заморачивался подобной проблемой, будте добры, поделитесь ссылкой на какую-нибудь годную статью по теме. Если она будет еще и на русском, то это вообще пушка.

 

Aswed
()

ocaml длина строки

Уважаемые форумчане, не копался ли кто в реализациях окамла? Мне очень хочется знать, как там вычисляется длина строки. Как в Си или Хаскеле за O(n) или по-нормальному за O(1)? Или какая-то другая сложность? Нигде не могу найти прямого ответа на этот вопрос.

 ,

Aswed
()

Контекстно зависимые языки

Я немного не понимаю смысл понятия «контекстно зависимый язык». Является ли javascript контекстно зависимым из-за того, что значение this определяется в момент исполнения кода? т. е.

function foo(){
  this.x = 1
}
var a = {}
a.f = foo
a.f()
// a.x == 1

 , ,

Aswed
()

Си и замыкания

Я тут как-то услышал, что Си поддерживает локальные функции. Сначала не верил, потому, что в плюсах это не работает, однако проверил и был удивлен. Но потом попытался замыкание, и оно тоже заработало. Это конечно хорошо, но почему это работает? Разве локальные функции(в примере «a» и «b») не создаются в стеке и не должны разрушаться по выходу из глобальной функции(в примере «foo»)?

#include <stdio.h>

int (*foo(int key))(int){
	int a(int x){
		return x+1;
	}
	int b(int x){
		return x-1;
	}
	if (key == 0)
		return a;
	else
		return b;
}

int main(){
	int (* f1)(int) = foo(0);
	int (* f2)(int) = foo(1);
	printf("%d %d\n",f1(5),f2(5));
	return 0;
}

 , ,

Aswed
()

вернуть указатель на двумерный массив

Здравствуйте уважаемые сишники. Имеется несколько статических двумерных массивов, все M x N. Как записать тип функции, которая вернет указатель на один из этих массивов? Очень не хочется переделывать на char**.

 

Aswed
()

javascript за пределами web

Уважаемые знатоки, скажите пожалуйста, существуют ли реализации javascript для написания чего-нибудь прикладного? Что бы его можно было использовать как питон, например. Я слышал про node.js, но оно вроде как используется только на веб-серверах.

 

Aswed
()

простой и открытый 3d движок

Посоветуйте, пожалуйста, простой(шейдерная вода, сложное освещение, туман и т.д. не требуется) 3D движок, что-бы сырцы были открыты. Желательно С или С++. Нужен, что бы игоры для смартфонов делать.

 

Aswed
()

vim eval string

Как в виме исполнить набор команд записанных строкой? например есть такая строка

let comment = "^i#<esc>"
исполнение которой должно комментировать строчку.

 

Aswed
()

Google gamecenter connection failed

Пытаюсь приконнектится к гугловскому геймцентру и все время ловлю ошибку

ConnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent{4156a1a0: android.os.BinderProxy@4156afe0}}
Пиложение в гугле создано, id-шник включен там как тестовый. Что может вызывать такую ошибку?

 

Aswed
()

cabal не признает glib

Я пытабсь поставить gtk2hs, а оно зависит от пакета glib, при компиляции которого мне кабал выдает

[1 of 2] Compiling Gtk2HsSetup      ( Gtk2HsSetup.hs, dist/setup-wrapper/Gtk2HsSetup.o )
[2 of 2] Compiling Main             ( SetupMain.hs, dist/setup-wrapper/Main.o )
Linking dist/setup-wrapper/setup ...
Configuring glib-0.12.4...
setup: The pkg-config package glib-2.0 is required but it could not be found.
cabal: Error: some packages failed to install:
glib-0.12.4 failed during the configure step. The exception was:
ExitFailure 1
При этом glib есть
$ aptitude search glib2.0
i   libglib2.0-0                                                 
p   libglib2.0-0:i386
p   libglib2.0-0-dbg                                   
p   libglib2.0-0-dbg:i386                                   
p   libglib2.0-0-refdbg                                
p   libglib2.0-0-refdbg:i386                                
i A libglib2.0-bin                                              
p   libglib2.0-bin:i386                                              
p   libglib2.0-cil                              
p   libglib2.0-cil:i386                              
p   libglib2.0-cil-dev                              
p   libglib2.0-cil-dev:i386                             
i A libglib2.0-data                                                
v   libglib2.0-data:i386                                                     
p   libglib2.0-dev                                           
p   libglib2.0-dev:i386                                     
p   libglib2.0-doc                                         
v   libglib2.0-doc:i386                                                      
p   libtaglib2.0-cil

 , , ,

Aswed
()

grub не загружает ядро

Здравствуйте, у меня такая проблема: Устанавливал бубунту, все установилось, в конце вылезло сообщение, что граб неможно поставить. Зашел с лайфсиди сделал

sudo mount /dev/sda1 /mnt
sudo grub-install --root-directory=/mnt /dev/sda
при запуске вылезает граб, но не менюшкой, а командной строкой. я ему говорю
linux /vmlinuz
boot
после этого начинается загрузка во время которой вылезает сообщение
Please append a correct "root=" boot options; here are available partitions:
kernel panic - not syncing
VFS: unable to mount root fs on unknown-block(0,0)
Это сообщение вылезает даже если я явно указываю
set root=(hd0,1)
Система находится на (hd0,1) и это не логический диск, а первичный.

 ,

Aswed
()

порт cpython для haskell

Нашел в кабале Language.Python, хотел попробовать, но не нашел ни концов, ни документации. Если кто использовал, подскажите, как мне распарсить код и исполнить его с каким-нибудь окружением.

 ,

Aswed
()

Проверка на решабельность

Есть старая игра с числами(название не помню). Дано поле с числами. Можно удалить соседние если они равны или в сумме дают 10. Соседними так же считаются числа между которыми зачеркнутые числа. Еще соседними числами считаются последнее число строки N и первое число строки N+1. Задача игры - вычеркнуть все числа. Если ходы закончились - то все незачеркнутые числа дублируются. Вот пример http://numbers.mokoron.ru/ Я хочу написать решалку такой игры и мне интересно существует ли алгоритм для проверки имеет ли текущее состояние решение, без нахождения самого решения. Может кто нибудь сталкивался с чем-то подобным или имеет какие нибудь идеи?

 ,

Aswed
()

не могу регулярку в виме

Я хочу отредактировать файл подсветки синтаксиса для vim. Скажите, как ему задать регулярку «[A_Z]+[A_Za_z0_9]*»?

 , ,

Aswed
()

RSS подписка на новые темы