Форум программистов, компьютерный форум CyberForum.ru

Класс в dll - C++

Восстановить пароль Регистрация
 
Stason676
Заблокирован
21.11.2013, 10:54     Класс в dll #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
 
//файл Errors.h
 
#ifdef ERRORS_DLL
#define ERRORS_DLL __declspec(dllexport)
#else
#define ERRORS_DLL __declspec(dllimport)
#endif
 
/*Состояние автомата.
STA-начало строки, END-конец строки, OPR-операнд, 
BIO-бинарный знак операции, SQR-квадратный корень,
MIN-минус, LP-левая скобка, RP-правая скобка,
BAD-символ не опознан. state-текущее состояние,
memory-предыдущее состояние.*/
enum State { STA, END, DIG, ALF, BIO, SQR, MIN, LP, RP, BAD};                   
 
class ERRORS_DLL Errors
{
private:
        
    /*state-текущее состояние, prevState-прошлое состояние
    varState-состояние переменной.*/
    State state, prevState, varState;
 
    //true если цифра.
    bool IsDigit(char);
 
    //true если буква.
    bool IsAlpha(char);
 
    //true если оператор бинарный.
    bool IsBinOp(char);
 
    //Парсер
    State Parser(char);
 
public:
 
    //Конструктор.
    Errors();
 
    //Поиск недопустимых последовательностей во входящей строке.
    char* BadChain(char*);
 
    //Исключение если в строке обнаружены ошибки.
    class BadExpression
    {
    public:
        
        char* message;
 
        BadExpression()
        {
            message = "EXCEPTION.Expression is not accepted.";
        }
    };
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//файл Errors.cpp
 
#include "Errors.h"
 
//true если цифра.
bool Errors::IsDigit(char ch)
{
    char table[] = { '0','1','2','3','4','5','6','7','8','9','.','\0' };
 
    for(int i = 0; table[i]; ++i)
        if(ch == table[i])
            return true;
    
    return false;
}
 
//true если буква.
bool Errors::IsAlpha(char ch)
{
    char table[] = 
    {  
        'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i',
        'J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r',
        'S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','\0'
    };
 
    for(int i = 0; table[i]; ++i)
        if(ch == table[i])
            return true;
 
    return false;
}
 
//true если оператор бинарный.
bool Errors::IsBinOp(char ch)
{
    char table[] = { '*', '/', '+', '\0' };
 
    for(int i = 0; table[i]; ++i)
        if(ch == table[i])
            return true;
 
    return false;
}
 
//Парсер
State Errors::Parser(char ch)
{
    if(IsDigit(ch)) state = DIG;
    else if(IsAlpha(ch)) state = ALF;
    else if(IsBinOp(ch)) state = BIO;
    else if(ch == '^') state = SQR;
    else if(ch == '-') state = MIN;
    else if(ch == '(') state = LP;
    else if(ch == ')') state = RP;
    else if(ch == ';') state = END;
    else state = BAD;
        
    return state;
}
 
//Конструктор.
Errors::Errors()
{
    //Запись в память автомата положение старт.
    prevState = STA;
    varState = STA;
}
 
//Поиск недопустимых последовательностей во входящей строке.
char* Errors::BadChain(char* exp)
{
    //Выражение не должно превышать 256 символов.
    if(strlen(exp) > 255) throw BadExpression();
 
    char* workStr = new char[strlen(exp) + 2];
    strcpy(workStr, exp);
    
    //Замена зарезервированного символа ';' на '@'.
    for(unsigned i = 0; workStr[i]; ++i)
        if(exp[i] == ';')
            exp[i] = '@';
 
    //Вcтавить в конец строки ';' чтобы переключть автомат в стстояние "END".
    workStr[strlen(exp) + 1] = ';';
    workStr[strlen(exp) + 2] = 0;
 
    for (unsigned i = 0; workStr[i]; ++i)
    {
        switch(Parser(workStr[i]))
        {
            case END:
                switch(prevState)
                {
                    case STA: case BIO:
                    case SQR: case MIN:
                    case LP: throw BadExpression();
                }
                break;
            case DIG:
                if(prevState == RP) throw BadExpression();
                if(varState == STA) varState = DIG;
                prevState = DIG;
                break;
            case ALF:
                if(prevState == RP) throw BadExpression();
                if(varState == DIG) throw BadExpression();
                prevState = ALF; varState = ALF;
                break;
            case BIO:
                switch(prevState)
                {
                    case STA: case BIO:
                    case SQR: case MIN:
                    case LP: throw BadExpression();
                }
                prevState = BIO; varState = STA;
                break;
            case SQR:
                switch(prevState)
                {
                    case DIG: case ALF:
                    case BIO: case SQR:
                    case MIN: throw BadExpression();
                }
                prevState = SQR; varState = STA;
                break;
            case MIN:
                switch(prevState)
                {
                    case BIO: case SQR:
                    case MIN: throw BadExpression();
                }
                prevState = MIN; varState = STA;
                break;
            case LP:
                switch(prevState)
                {
                    case DIG: case ALF:
                    case RP: throw BadExpression();
                }
                prevState = LP; varState = STA;
                break;
            case RP:
                switch(prevState)
                {
                    case STA: case BIO:
                    case SQR: case MIN:
                    case LP: throw BadExpression();
                }
                prevState = RP; varState = STA;
                break;
            case BAD: throw BadExpression();
        }
    }
    //char* massege = "Expression accepted";
    return "Expression accepted";
}
Предупреждение 2 warning C4273: Errors::IsAlpha: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 17
Предупреждение 3 warning C4273: Errors::IsBinOp: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 34
Предупреждение 1 warning C4273: Errors::IsDigit: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 5
Предупреждение 4 warning C4273: Errors::Parser: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 46

VS предупреждает как исправить? Спасибо.

Добавлено через 15 часов 30 минут
C++
1
2
3
4
5
#ifdef ERRORS_DLL
#define ERRORS_DLL __declspec(dllexport) //Поменял местами эти
#else
#define ERRORS_DLL __declspec(dllimport) //две строчки и все заработало
#endif
Пожалуйста объясните почему или ссылку на подробное понятное описание. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2013, 10:54     Класс в dll
Посмотрите здесь:

C++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
C++ Как импортировать и экспортировать из dll класс?
Visual C++ Помогите MFC-ый класс перенести в DLL
C++ Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами
Как узнать путь к загруженной DLL из самой DLL? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
21.11.2013, 11:17     Класс в dll #2
а что такое ERRORS_DLL в объявлении класса ?
тфу ты зелёным шрифтом то и не заметил )) ща расскажу

Добавлено через 2 минуты
сразу уточню, что вы конкретно хотите экспортировать из DLL ?

Добавлено через 12 минут
В общем ты же собирался экспортировать функции и класс? У тебя не правильно написаны ifdef-ы, забей на макросы и пиши явно объявление класса так: class __declspec(dllexport) Errors.
P.S.: в 2012-й студии у тебя ещё один error будет по поводу безопасности strcpy:
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
ну в общем ты понял
Stason676
Заблокирован
29.11.2013, 09:39  [ТС]     Класс в dll #3
мне просто интересно что конкретно делает этот макрос
newbie666
Заблокирован
29.11.2013, 11:20     Класс в dll #4
Цитата Сообщение от Stason676 Посмотреть сообщение
мне просто интересно что конкретно делает этот макрос
ну хочу копипастить сюда текст статьи - вот по русский всё коротко и ясно про ипорт и экспорт макросы - http://citforum.ru/book/cook/dll0.shtml

Добавлено через 1 минуту
а это ERRORS_DLL - твоё собственное объявление
Yandex
Объявления
29.11.2013, 11:20     Класс в dll
Ответ Создать тему
Опции темы

Текущее время: 05:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru