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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Stason676
Заблокирован
#1

Класс в dll - C++

21.11.2013, 10:54. Просмотров 558. Ответов 3
Метки нет (Все метки)

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
Посмотрите здесь:

Импортировать класс из dll - C++
Хай. У меня есть dll #include &quot;stdafx.h&quot; #include &lt;Windows.h&gt; #include &lt;iostream&gt; using namespace std; extern &quot;C++&quot;...

Передать в DLL указатель на класс - C++
В основной программе хочю сделать чтото типа class fprognoz { public: double End_chen; int rezult; __int64 ...

Как импортировать и экспортировать из dll класс? - C++
Помогите, плз. Создал dll: //... class __declspec(dllexport) a { public : a(); }; a::a() {

Оцените класс больших чисел класс big_int - C++
big_int - класс больших чисел. Цифра храниться в строке. Работать будет как int, но во много раз больше (120-тизначное число). &quot;+&quot; и &quot;-&quot;...

Класс создающий класс и любого его наследника - C++
Есть класс: #pragma once #include &lt;string&gt; #include &quot;Entity.h&quot; class ObjectList { private: //Global List struct List_ {...

Класс объявление с элементом типа класс Текст - C++
Необработанное исключение в &quot;0x770015de&quot; в &quot;FAQ.exe&quot;: 0xC0000005: Нарушение прав доступа при записи...

Класс А не принимает член-переменную с типом класс Б - C++
Разработка ведётся в Visual Studio 2010 с использованием MFC Есть некий класс AnswersStatistic, header которого приведён ниже: ...

Класс двумерная точка и класс многоугольник - C++
Всем привет Ну с двумерной точкой всё более- менее ясно. Вот набросок class DOT2 { int x, y; public: DOT2* next;

Класс создающий другой класс (ошибка) - C++
Начал писать прогу, суть в том, что один класс должен создавать группу объектов другого класса, написал один класс - работало, а во втором...

Наследование. Класс Круг и класс эллипс - C++
Здравствуйте уважаемые программисты. Нужно исправить ошибки в программе. Честно я в этом ничего не понимаю. Вот код программы: #include...

Класс строка, класс текст, агрегация - C++
12. Текст (2 класса: строка, текст находятся в отношении агрегации) Конструкторы: по умолчанию, с параметрами и копирования. ...

Класс данных, класс сортировок - C++
#include &lt;stdexcept&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;Windows.h&gt; #include &lt;iomanip.h&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru