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

После возвращении вектор пуст, хотя в dll size другая информация - C++

Восстановить пароль Регистрация
 
Vardanito
0 / 0 / 0
Регистрация: 18.08.2013
Сообщений: 71
24.07.2014, 23:13     После возвращении вектор пуст, хотя в dll size другая информация #1
передаю вектор по ссылке в функцию dll
он должен вставить элемент
но после возвращении вектор пуст,хотя в dll size показывает правильно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
24.07.2014, 23:19     После возвращении вектор пуст, хотя в dll size другая информация #2
Надо или отказаться от STL на границах или все компилить одним компилятором с одинаковыми настройками
Vardanito
0 / 0 / 0
Регистрация: 18.08.2013
Сообщений: 71
24.07.2014, 23:38  [ТС]     После возвращении вектор пуст, хотя в dll size другая информация #3
у меня есть структура хочу из длл получить массив таких структур что предложишь?
и еще в структуре есть указатель,в длл файле создается указатель
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
24.07.2014, 23:46     После возвращении вектор пуст, хотя в dll size другая информация #4
Цитата Сообщение от Vardanito Посмотреть сообщение
есть структура хочу из длл получить массив таких структур
C++
1
2
3
4
5
6
7
8
9
10
extern "C" MyStruct * createMyStructs(size_t * size);
extern "C" void freeMyStructs(MyStruct * structs);
//.................
 
size_t size;
MyStruct * array = createMyStructs(&size);
 
//..........
 
freeMyStructs(array);
А вообще, это зависит от задачи. Иногда можно вообще ничего не возвращать, а сделать заполнение какого-либо контейнера через callback-функтор.
Или все-таки можно использовать вектор, но для этого должны быть особые условия. Одинаковый компилятор (вплоть до версии), одинаковый С++ runtime на обеих сторонах (exe и dll) в количестве одной штуки на всех. Вектор передавать по ссылке. Но, вообще, обычно так не делают. Непереносимо и очень легко поломать все.
Есть простое правило, ресурс должен быть освобожден на той же стороне, на которой был выделен. Т.е. если ты массив создал в dll, то и разрушать его должен там же. Если его придерживаться, то большинство проблем можно будет избежать.
Vardanito
0 / 0 / 0
Регистрация: 18.08.2013
Сообщений: 71
24.07.2014, 23:53  [ТС]     После возвращении вектор пуст, хотя в dll size другая информация #5
у меня так exe создает вектор из структур функцию длл,тот должен создать указатели на мои объекты,создать структуры и заполнить вектор
примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
extern "C" __declspec(dllexport) void  DLLHandlers(IHost* core_obj,vector<HandlerGetArgument>& handtable,int& a)
{
    
    showcategoryhandler* show=new showcategoryhandler((*core_obj->GetCore()));
    HandlerGetArgument showarg;
    a=5;
    showarg.c_handler=show;
    showarg.name="fastshow";
    handtable.push_back(showarg);
    std::cout<<2;
}
Добавлено через 24 секунды
cout-и я для себя поставил
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
25.07.2014, 00:12     После возвращении вектор пуст, хотя в dll size другая информация #6
Цитата Сообщение от Vardanito Посмотреть сообщение
у меня так exe создает вектор из структур функцию длл
Опасный код. Может он и будет работать при определенных условиях, но в реальных задачах лучше все-таки так не делать.
Иногда можно сделать так, но это скорее универсальный вариант, чем лучший, но он безопасен при соблюдении правила, которое я выше описал (в данном случае на стороне dll должен быть освобожден c_handler):
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
// эту функцию мы экспортируем
extern "C" __declspec(dllexport)
void DLLHandlers(IHost* core_obj, int * a, void * container, void(*hFuncAdd)(void *, HandlerGetArgument const *))
{
    *a = 5;
    for(int i = 0; i < 5; ++i) // ну например 5 элементов
    {
        HandlerGetArgument arg;
 
        arg.c_handler = new showcategoryhandler((*core_obj->GetCore()));
        arg.name      = "fastshow";
 
        hFuncAdd(container, &arg);
    }
}
 
// это функция только в h-файле dll, ее мы и будем вызывать на стороне exe
inline
void DLLHandlersVec(IHost* core_obj, int & a, std::vector<HandlerGetArgument> & vec)
{
    struct Functor
    {
        static void push_back(void * c, HandlerGetArgument const * arg)
        {
            static_cast<std::vector<HandlerGetArgument>*>(c)->push_back(*arg);
        }
    };
    DLLHandlers(core_obj, &a, &vec, &Functor::push_back);
}
Vardanito
0 / 0 / 0
Регистрация: 18.08.2013
Сообщений: 71
25.07.2014, 10:57  [ТС]     После возвращении вектор пуст, хотя в dll size другая информация #7
я должен подключать хидер файл к моему проекту?
просто у меня все это должно быть динамически
а еще нельзя как нибудь обойти этот void* он меня пугает )))

Добавлено через 1 час 7 минут
и да еще объясните пожалуйста что происходит?ведь в длл он показывает что push сделан а в еxe показывает что вектор пуст
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 19:01     После возвращении вектор пуст, хотя в dll size другая информация
Еще ссылки по теме:

Глобальный вектор. Почему на выходе этот массив пуст? C++
C++ Добавить вектор-столбец после всех столбцов, элементы которых образуют убывающую последовательность
Вектор: вставить новый элемент после последнего положительного C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
25.07.2014, 19:01     После возвращении вектор пуст, хотя в dll size другая информация #8
Цитата Сообщение от Vardanito Посмотреть сообщение
я должен подключать хидер файл к моему проекту?
просто у меня все это должно быть динамически
Да. Оно будет динамически. Хидер сам по себе не делает библиотеку "не динамической". Так не понятно что и почему нужно сделать? Тут главное чтобы ты понял суть, а не просто повторил что тут написали. Иначе так и будет в голове мысль, что "это все фигня какая-то".
Цитата Сообщение от Vardanito Посмотреть сообщение
а еще нельзя как нибудь обойти этот void* он меня пугает
Можно, см. мой первый пост. Но вообще тут предполагается, что ты не будешь использовать непосредственно void* и функцию DLLHandlers, они же обернуты в функцию-wrapper DLLHandlersVec. Пользоваться предполагается именно ей.
Цитата Сообщение от Vardanito Посмотреть сообщение
и да еще объясните пожалуйста что происходит?
Сложно сказать заочно, но скорее всего нарушение ODR. Вектор, который ожидается в DLL слегка отличается от вектора, который передается на стороне exe. Произойти это может по разным причинам, от разных ключей компиляции dll и exe или режимов сборки (debug\release), до разных версий рантаймов, прилинкованных к dll и exe.
Yandex
Объявления
25.07.2014, 19:01     После возвращении вектор пуст, хотя в dll size другая информация
Ответ Создать тему
Опции темы

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