KBAC
|
|
« : 24-03-2012 14:11 » |
|
Есть файл "propertygrammar.h" #pragma once #ifndef R #define R
#include <string> using namespace std;
#define COUNT_RULES 23
extern struct line { char *value; int property; line *next; };
extern struct mnote { int m; string l; mnote *next; };
bool keytest (char*, line*); int mcompute (char*, int); void writetable (char*, int, line*);
// количество символов правой части для каждого правила const short int CS[] = {1,2,1,2,1,2,5,3,0,2, 1,3,2,4,0,1,3,1,1,1,3,3,1,0,2,2};
// массив для хранения свойств текущего правила line *alltable[20] = {0}; // массив указателей на таблицы допустимых свойств (m) mnote *mtables[COUNT_RULES];
void inputMtable(); int searchKey(string, int); char itoch(int);
#endif Я его включаю в .срр и в .h. Почему пишет 1>flex.obj : error LNK2005: "struct mnote * * mtables" (?mtables@@3PAPAUmnote@@A) уже определен в bison.obj 1>flex.obj : error LNK2005: "struct line * * alltable" (?alltable@@3PAPAUline@@A) уже определен в bison.obj 1>propertygrammar.obj : error LNK2005: "struct mnote * * mtables" (?mtables@@3PAPAUmnote@@A) уже определен в bison.obj 1>propertygrammar.obj : error LNK2005: "struct line * * alltable" (?alltable@@3PAPAUline@@A) уже определен в bison.obj 1>C:\Users\Dude\Documents\Visual Studio 2010\Projects\ТЯП_КП_PERL\Debug\ТЯП_КП_PERL.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более Не понимаю где могут быть определены еще эти структуры. Смотрел в исходниках по поиску - ничего. Можете убедиться сами. Залил исходники сюда http://rghost.ru/37195100. Буду очень благодарен если хоть кто-то поглядит исходники.
|
|
|
Записан
|
У тебя все получится, главное -- верить и делать. Порадоваться, когда все плохо -- легче, чем ты думаешь. В действии счастье. Вовлекая людей важно быть увлеченным чужой жизнью.
|
|
|
RXL
|
|
« Ответ #1 : 24-03-2012 15:12 » |
|
KBAC, у тебя в заголовке определены глобальные переменные. Заголовок, видимо, используется в разных модулях. Соотв., при компиляции получается несколько экземпляров переменной и линкер не может решить возникший конфликт.
В заголовках используй объявления extern, а сами переменные определи только в одном модуле.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #2 : 24-03-2012 15:17 » |
|
А зачем нужно ключевое слово extern при объявлении структур?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #3 : 24-03-2012 15:26 » |
|
А зачем нужно ключевое слово extern при объявлении структур?
Чтобы можно было обращаться к глобальной переменной в другом модуле.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #4 : 24-03-2012 15:28 » |
|
RXL, В коде только объявление структуры. Нету никаких переменных привязвнных к структуре при объявлении.
|
|
« Последнее редактирование: 24-03-2012 15:30 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #5 : 24-03-2012 15:29 » |
|
Разве? // количество символов правой части для каждого правила const short int CS[] = {1,2,1,2,1,2,5,3,0,2, 1,3,2,4,0,1,3,1,1,1,3,3,1,0,2,2};
// массив для хранения свойств текущего правила line *alltable[20] = {0}; // массив указателей на таблицы допустимых свойств (m) mnote *mtables[COUNT_RULES];
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #6 : 24-03-2012 15:31 » |
|
Угу extern struct line { char *value; int property; line *next; };
extern struct mnote { int m; string l; mnote *next; };
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #7 : 24-03-2012 15:37 » |
|
1>flex.obj : error LNK2005: "struct mnote * * mtables" (?mtables@@3PAPAUmnote@@A) уже определен в bison.obj 1>flex.obj : error LNK2005: "struct line * * alltable" (?alltable@@3PAPAUline@@A) уже определен в bison.obj 1>propertygrammar.obj : error LNK2005: "struct mnote * * mtables" (?mtables@@3PAPAUmnote@@A) уже определен в bison.obj 1>propertygrammar.obj : error LNK2005: "struct line * * alltable" (?alltable@@3PAPAUline@@A) уже определен в bison.obj
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #8 : 24-03-2012 15:49 » |
|
Собственно Ром, не к тебе был вопрос А к топикпастеру. Как дополнение к твоему ответу.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #9 : 24-03-2012 15:49 » |
|
Ну, а я не понял.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
KBAC
|
|
« Ответ #10 : 26-03-2012 16:03 » |
|
Прошу прощения за задержку ответа в столь интересной теме В общем, немного почитал, изменил, но все равно не получилось. файл .h #pragma once
#include <string> using namespace std;
#define COUNT_RULES 23
struct line { char *value; int property; line *next; }; struct mnote { int m; string l; mnote *next; };
bool keytest (char*, line*); int mcompute (char*, int); void writetable (char*, int, line*);
void inputMtable(); int searchKey(string, int); char itoch(int);
// количество символов правой части для каждого правила extern const short int CS[]; // массив для хранения свойств текущего правила line *alltable[20]; // массив указателей на таблицы допустимых свойств (m) mnote *mtables[COUNT_RULES]; файл определений .срр #include "propertygrammar.h" #include <fstream> #include <iostream>
extern const short int CS[] = {1,2,1,2,1,2,5,3,0,2, 1,3,2,4,0,1,3,1,1,1,3,3,1,0,2,2};
extern mnote *mtables[COUNT_RULES] = {0}; extern line *alltable[20] = {0}; // ... Ошибки те же самые. Добавлено через 1 минуту и 45 секунд:Finch, пробовал методом простого перебора решить проблему. Добавлено через 40 минут и 8 секунд:Все , разобрался. // количество символов правой части для каждого правила extern const short int CS[]; // массив для хранения свойств текущего правила extern line *alltable[20]; // массив указателей на таблицы допустимых свойств (m) extern mnote *mtables[COUNT_RULES];
|
|
« Последнее редактирование: 26-03-2012 16:45 от KBAC »
|
Записан
|
У тебя все получится, главное -- верить и делать. Порадоваться, когда все плохо -- легче, чем ты думаешь. В действии счастье. Вовлекая людей важно быть увлеченным чужой жизнью.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 26-03-2012 16:52 » |
|
KBAC, уже изобрели классы. Не слышал ?
|
|
|
Записан
|
|
|
|
гайка
Гость
|
|
« Ответ #12 : 27-03-2012 15:43 » |
|
Алексей1153++, он использует код, сгенерированный одной примерзкой утилитой. Она не в курсе, что классы уже появились
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #13 : 27-03-2012 15:50 » |
|
Название в студию.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
KBAC
|
|
« Ответ #14 : 27-03-2012 16:14 » |
|
Да, слышал. Только как прикрутить их по-умному наверно буду думать когда на душе легче станет, что ничего еще не сделано вообще. Так сразу в глаза не бросается как это можно сделать. Утилка называется Bison. http://www.linux.org.ru/books/GNU/bison/bison_1.html
|
|
|
Записан
|
У тебя все получится, главное -- верить и делать. Порадоваться, когда все плохо -- легче, чем ты думаешь. В действии счастье. Вовлекая людей важно быть увлеченным чужой жизнью.
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #15 : 27-03-2012 16:39 » |
|
Ну там ясно сказано С без плюсов. Не должен знать классов.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #16 : 27-03-2012 16:41 » |
|
KBAC, генерируемый код то поди сишный, без полюсов?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
KBAC
|
|
« Ответ #17 : 28-03-2012 15:33 » |
|
RXL, именно. Но надо еще сделать алгоритм семантического анализа. За меня этот алгоритм никто не напишет, так что есть смутная возможность вставить классы в какую-нибудь щель между прочим кодом.
|
|
|
Записан
|
У тебя все получится, главное -- верить и делать. Порадоваться, когда все плохо -- легче, чем ты думаешь. В действии счастье. Вовлекая людей важно быть увлеченным чужой жизнью.
|
|
|
RXL
|
|
« Ответ #18 : 28-03-2012 16:39 » |
|
А компилятор С++? В таком случае лучше оборачивать код: extern "C" { // сишный код }
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
KBAC
|
|
« Ответ #19 : 28-03-2012 20:53 » |
|
Не знал такую примочку. Спасибо за совет.
|
|
|
Записан
|
У тебя все получится, главное -- верить и делать. Порадоваться, когда все плохо -- легче, чем ты думаешь. В действии счастье. Вовлекая людей важно быть увлеченным чужой жизнью.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 29-03-2012 08:53 » |
|
Гайка, ужасы какие-то )
|
|
|
Записан
|
|
|
|
|