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

C++ and dll -> нужна консультация на моём примере - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нахождение минимальной строки в массиве и смена мест в ней строк http://www.cyberforum.ru/cpp-beginners/thread574847.html
Из 32 положительных, отрицательных и нулевых значений чисел сформируйте матрицу 4 х 8. Поменяйте местами строку, содержащую минимальный элемент, с первой строкой, выдайте преобразованную матрицу. Помогите. Вроде написал, но выдает кривую матрицу, с небесными числами(порядка миллиадров и т.п.) // lb61.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h"...
C++ scanf,cin разбор ввода данных Доброго времени суток :) Подскажите как взять с консоли или скажем с файла(fscanf) 2 числа и текст между (текст и числа разделены знаками препинания) или до них вот пример: 15.Text.23 Text.15.23 Text:15:23 логично что ... http://www.cyberforum.ru/cpp-beginners/thread574842.html
Двойной указатель C++
Это не совсем C++ вроде, а просто C, но поясните, пожалуйста, зачем в коде в строчку **sums=NULL используется двойной указатель? #include <stdio.h> #include <process.h> #include <math.h> float *a, *b, *x, *y, **sums; int N, K; //N - number of data points //K - polinom power //K<=N
C++ как узнать время работы программы решения алгоритма
Добрый вечер! Подскажите, пожалуйста, как сделать так, чтобы программа выводила на экран время, затраченное на решение алгоритма? Можно ли узнать, сколько ресурсов затрачено на решение? #include <iostream.h> #include <conio.h> #include <windows.h> #include<iomanip.h> char NEWT; char*RUS(char*TEXT) {
C++ последовательность http://www.cyberforum.ru/cpp-beginners/thread574810.html
Даны n, последовательность n x , x ,...x 1 2 . Получить (1+R)/(1+S), где R – сумма тех членов последовательности, которые не превосходят 1, а S – сумма членов, больших 1. Использовать динамические массивы.
C++ strtok() Необходимо выводить имя в формате Фамилия И. или Фамилия И.О. Для этого решил исполльзовать функцию strtok. Т.е. сначала я вывожу полностью фамилию, а затем имя и, в случае, если есть отчество, то и отчество (например, такие имена как Бьерн Страуструп отчества не имеют, поэтому вывести необходимо только Бьерн С.). Одну и тоже фамилию придется выводить больше одного раза. Тут возникли проблемы. ... подробнее

Показать сообщение отдельно
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 269

C++ and dll -> нужна консультация на моём примере - C++

15.05.2012, 20:35. Просмотров 274. Ответов 0
Метки (Все метки)

Нужно загрузить несколько классов в dll, а потом, в другом проекте прочитать эти классы из dll и, используя этот dll с помощью механизмов позднего связывания что-нибудь поделать)

Классы есть:
файл.h
C++ (Qt)
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
#pragma once
 
#include <vector>
#include <algorithm>
#include <time.h>
#include <iostream>
#include <Windows.h>
using namespace std;
 
namespace Sort_Classes{
 
 
class Sort_Basic
{
protected:
    double time;
    long size;
    vector<int>::iterator bi;
    vector<int>::iterator ei;
 
public:
    Sort_Basic(vector<int>::iterator,vector<int>::iterator,long);
 
double Get_Time();
 
template<typename T>
void IsSort(T b, T e)
    {
        bool flag = true;
        --e;
        while (b!= e)
            {
                if (*b>*(++b))
                    {
                        cout<<"ВНИМАНИЕ! Последовательность неотсортирована!<===ERROR";
                        flag = false;
                    }
            }
        if(flag)
            cout<<"Последовательность отсортирована";
    }
 
virtual void Sort()=0;
 
virtual ~Sort_Basic(void);
 
};
 
class Sort_Simple : public Sort_Basic
{
public:
    Sort_Simple(vector<int>::iterator,vector<int>::iterator,long);
 
void Sort();
 
 
};
 
class Sort_2thread_Basic : public Sort_Basic
{
protected:
    vector<int>::iterator avei;
    vector<int>& aim;
    
    /*Sort_2thread_Basic(vector<int>::iterator,vector<int>::iterator,long);*/
    Sort_2thread_Basic(vector<int> &);
 
 
void half_sort();
static DWORD WINAPI Potok_Sort(void *);
 
public:
void Sort();
 
};
 
class Sort_2t_1tM : public Sort_2thread_Basic
{
public:
    Sort_2t_1tM(vector<int> &);
 
void Sort();
};
 
class Sort_2t_2tM : public Sort_2thread_Basic
{
protected:
    vector<int>::iterator IT1;
    vector<int>::iterator IT2;
    long elem_size1;
    long elem_size2;
    vector<int>::iterator helper_it_begin;
 
static DWORD WINAPI Potok_Divide(void *);
static DWORD WINAPI Merge_Help(void *);
public:
    Sort_2t_2tM(vector<int> &);
 
void Sort();
 
 
};
 
    }
файл.cpp
C++ (Qt)
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
#include "StdAfx.h"
#include "Sort_Basic.h"
 
namespace Sort_Classes{
 
Sort_Basic::Sort_Basic(vector<int>::iterator b,vector<int>::iterator e, long size_)
    {
        bi = b;
        ei = e;
        size = size_;
    }   
 
double Sort_Basic::Get_Time()
{
    return time;
}
 
 
Sort_Basic::~Sort_Basic(void)
    {
    }
 
 
 
Sort_Simple::Sort_Simple(vector<int>::iterator b,vector<int>::iterator e,long size):Sort_Basic(b,e,size)
{
 
}
 
void Sort_Simple::Sort()
{
    long start = clock();
    sort(bi,ei);
    long end = clock();
    time = (end-start)*0.001;
    IsSort(bi,ei);
    cout<<endl<<"ОБЫЧНАЯ СОРТИРОВКА. Время => "<<time<<" сек"<<endl<<endl;
}
 
 
/*Sort_2thread_Basic::Sort_2thread_Basic(vector<int>::iterator b,vector<int>::iterator e,long size):Sort_Basic(b,e,size)
{
    avei = b;
    advance(avei,size/2);
}*/
 
Sort_2thread_Basic::Sort_2thread_Basic(vector<int> &vec):Sort_Basic(vec.begin(),vec.end(),vec.size()), aim(vec)
{
    avei = bi;
    advance(avei,size/2);
}
 
void Sort_2thread_Basic::half_sort()
{
    
    vector<int>::iterator p[2];
    p[0]=avei;
    p[1]=ei;
    HANDLE potok = CreateThread(NULL, 0, Sort_2thread_Basic::Potok_Sort, this, 0, NULL);
    sort(bi,avei);
    WaitForSingleObject(potok, INFINITE);
}
 
 
DWORD Sort_2thread_Basic::Potok_Sort (void* param)
{
    Sort_2thread_Basic * p = static_cast<Sort_2thread_Basic*>(param);
    sort(p->avei, p->ei);
    
 
/*vector<int>::iterator* p=static_cast<vector<int>::iterator*> (param);
    sort(p[0],p[1]);
        */
    return 0;
}
 
void Sort_2thread_Basic::Sort()
{
 
}
 
Sort_2t_1tM::Sort_2t_1tM(vector<int> &vec):Sort_2thread_Basic(vec)
{
 
}
 
void Sort_2t_1tM::Sort()
{
    long start = clock();
    half_sort();
    vector<int> helper(size);
    merge(aim.begin(),avei,avei,aim.end(),helper.begin());
    swap(aim,helper);
    long end = clock();
    time = (end-start)*0.001;
    IsSort(aim.begin(),aim.end());
    cout<<endl<<"СОРТИРОВКА 2 ПОТОКА___MERGE 1 ПОТОК. Время => "<<time<<" сек"<<endl<<endl;
}
 
 
Sort_2t_2tM::Sort_2t_2tM(vector<int> &vec):Sort_2thread_Basic(vec)
{
 
}
 
void Sort_2t_2tM::Sort()
{
    long start = clock();
    half_sort();
    HANDLE potok1 = CreateThread(NULL, 0, Sort_2t_2tM::Potok_Divide, this, 0, NULL);
    
    vector<int> helper(size);
    helper_it_begin = helper.begin();
    WaitForSingleObject(potok1,INFINITE);
 
    HANDLE potok2 = CreateThread(NULL, 0, Sort_2t_2tM::Merge_Help, this, 0, NULL);
    
    auto To = helper.begin();
    advance(To, elem_size1 + elem_size2);
    merge(IT1, avei, IT2, ei, To);
    
    WaitForSingleObject(potok2, INFINITE);
    swap(aim,helper);
 
    long end = clock();
    time = (end-start)*0.001;
    IsSort(aim.begin(),aim.end());
    cout<<endl<<"СОРТИРОВКА 2 ПОТОКА___MERGE 2 ПОТОКА. Время => "<<time<<" сек"<<endl<<endl;
}
 
DWORD Sort_2t_2tM::Potok_Divide(void *param)
{
    Sort_2t_2tM * p = static_cast<Sort_2t_2tM *>(param);
    p->IT1 = p->bi;
    p->elem_size1 = distance(p->bi, p->avei)/2;
    advance(p->IT1,p->elem_size1);
 
    auto IT1_copy = p->IT1;
    IT1_copy--; //может лучше *(IT1-1) ???
    auto find = *(IT1_copy);
 
    p->IT2 = lower_bound(p->avei, p->ei, find);
    p->elem_size2 = distance(p->avei, p->IT2);
    return 0;
}
 
DWORD Sort_2t_2tM::Merge_Help(void * param)
{
    Sort_2t_2tM * p = static_cast<Sort_2t_2tM *>(param);
    merge(p->bi, p->IT1, p->avei, p->IT2, p->helper_it_begin);
    return 0;
}
 
}
Всё работает, как часы из мейна, находящегося в этом же проекте
C++ (Qt)
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
#include "stdafx.h"
#include "Sort_Basic.h"
#include <fstream>
#include <conio.h>
 
using namespace Sort_Classes;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"rus");
    srand(time(0));
 
 
    unsigned N;
 
/*//Для записи в файл
    ofstream FILE;
    FILE.open("90000000.txt");
    N=90000000;
    FILE<<"2T1M\t1T\t2T2M"<<endl;
    for(int i=0; i<150; ++i)
{
//*/
 
//Консольная работа
    cout<<"Введите кол-во элементов (десятки миллионов)"<<endl;
    cin>>N;
    cout<<endl;
//  
try
    {
        vector<int> v1(N); //для обычного merge
        for(unsigned i=0; i<N; ++i)
            v1[i] = rand()*100000+rand();
        
        vector<int> v2(v1); //для обычного sort
        vector<int> v3(v1); //для двухпотомчного merge
 
        Sort_2t_1tM sorter1(v1);
        sorter1.Sort();
        //FILE<<(int)(sorter1.Get_Time()*1000)<<"\t";   //запись
 
 
        Sort_Simple sorter2(v2.begin(), v2.end(), v2.size());
        sorter2.Sort();
        //FILE<<(int)(sorter2.Get_Time()*1000)<<"\t";   //запись
 
        Sort_2t_2tM sorter3(v3);
        sorter3.Sort();
        //FILE<<(int)(sorter3.Get_Time()*1000)<<endl;   //запись
 
        //cout<<endl<<endl<<"Выполнено на "<<(int)(((double)i/150)*100)<<"%"<<endl<<endl; //запись
    }
 
catch(bad_alloc& ba)
    {
        cout<<"\n++++++++++++++++++++ERROR++++++++++++++++++++\n";
        cout<<"Аварийное завершение программы - не могу выделить столько памяти "<<ba.what()<<"\n";
    }
 
    getch();
//}//запись
    return 0;
}
Дальше хотел бы задавать вопросы по-порядку, а не все сразу:
Теперь пытаюсь сделать из моего неймспейса dll
Для этого поступаю так (кстати, вдруг, важно - VS 2010)
Создаю проект "библиотека классов"
копирую туда свои файлы .h и .cpp
И тут возникает вопрос - нашёл этот спецификатор "__declspec( dllexport )"
как я понял, его нужно вставлять, если я хочу, чтобы dll экспортировал мою функцию (ну и по аналогии - класс)
1.) нужно ли мне его вставлять перед именами класса? (ну или вообще куда-нибудь)

Добавлено через 9 часов 41 минуту


Добавлено через 9 часов 3 минуты
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru