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

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

Войти
Регистрация
Восстановить пароль
 
Vardanito
0 / 0 / 0
Регистрация: 18.08.2013
Сообщений: 71
#1

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

24.07.2014, 23:13. Просмотров 273. Ответов 7
Метки нет (Все метки)

передаю вектор по ссылке в функцию dll
он должен вставить элемент
но после возвращении вектор пуст,хотя в dll size показывает правильно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 23:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос После возвращении вектор пуст, хотя в dll size другая информация (C++):

Глобальный вектор. Почему на выходе этот массив пуст? - C++
юзаю либу вектор. почему на выходе этот массив пуст? std::vector<int> qw;//global int main() { int i=1; qw.push_back(i); ...

Заполнить квадратную матрицу змейкой по диагонали, начиная с элемента matrix[size-1][size-1] - C++
Требуется написать программу, которая заполняет массив размерности n*n по заданному правилу: 25 23 22 16 15 24 ...

MonoDevelop: нужны ресурсы и любая другая информация - Mono
Доброго времени суток коллеги. На c# уже программирую с пол года. Сейчас хочу создать кросплатформенное приложение. Как я узнал, самой...

Парсинг страниц: нужны статьи, книги и другая информация - C#
Всем привет, интересуют все возможные статью на эту тему, заранее благодарен.............

Нужен WPF учебник или другая информация для изучения - C# WPF
Подскажите пожалуйста кладезь инфы по работе с WPF.

HtmlAgilityPack и HTTP авторизация: нужны примеры, ссылки и любая другая информация - C#
Всем привет! Кто сталкивался с HtmlWeb класса HtmlAgilityPack для HTTP авторизации? Если можно примеры или ссылки. В сети на эту тему не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
24.07.2014, 23:19 #2
Надо или отказаться от STL на границах или все компилить одним компилятором с одинаковыми настройками
Vardanito
0 / 0 / 0
Регистрация: 18.08.2013
Сообщений: 71
24.07.2014, 23:38  [ТС] #3
у меня есть структура хочу из длл получить массив таких структур что предложишь?
и еще в структуре есть указатель,в длл файле создается указатель
DrOffset
7102 / 4243 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
24.07.2014, 23:46 #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  [ТС] #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
7102 / 4243 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
25.07.2014, 00:12 #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  [ТС] #7
я должен подключать хидер файл к моему проекту?
просто у меня все это должно быть динамически
а еще нельзя как нибудь обойти этот void* он меня пугает )))

Добавлено через 1 час 7 минут
и да еще объясните пожалуйста что происходит?ведь в длл он показывает что push сделан а в еxe показывает что вектор пуст
DrOffset
7102 / 4243 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
25.07.2014, 19:01 #8
Цитата Сообщение от Vardanito Посмотреть сообщение
я должен подключать хидер файл к моему проекту?
просто у меня все это должно быть динамически
Да. Оно будет динамически. Хидер сам по себе не делает библиотеку "не динамической". Так не понятно что и почему нужно сделать? Тут главное чтобы ты понял суть, а не просто повторил что тут написали. Иначе так и будет в голове мысль, что "это все фигня какая-то".
Цитата Сообщение от Vardanito Посмотреть сообщение
а еще нельзя как нибудь обойти этот void* он меня пугает
Можно, см. мой первый пост. Но вообще тут предполагается, что ты не будешь использовать непосредственно void* и функцию DLLHandlers, они же обернуты в функцию-wrapper DLLHandlersVec. Пользоваться предполагается именно ей.
Цитата Сообщение от Vardanito Посмотреть сообщение
и да еще объясните пожалуйста что происходит?
Сложно сказать заочно, но скорее всего нарушение ODR. Вектор, который ожидается в DLL слегка отличается от вектора, который передается на стороне exe. Произойти это может по разным причинам, от разных ключей компиляции dll и exe или режимов сборки (debug\release), до разных версий рантаймов, прилинкованных к dll и exe.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 19:01
Привет! Вот еще темы с ответами:

После сохранения FileName пуст - C# WPF
Все доброго времени суток. Проблема: после открытия диалогового окна, введении имени и сохранении файла ничего не происходит. Файл не...

Компилятор как будто не видит scanf, а fgets выполняет перед printf, хотя расстановка абсолютно другая - C (СИ)
В-общем, тема такая: читаю учебник, написано создать прогу для поиска текста в массиве строк. Создал поисковик песен. Все работало, решил...

Ошибка: firebird Size Mismatch - Field GROUP size is too small for data - Delphi БД
Возникла проблема, пишет Size Mismatch - Field FULL_ADR size is too small for data ошибку, которой не было, пока не заполнил Таблицу бд...

После удаления (перезаписи) данных из бинарного файла, файл всё равно существует, несмотря на то, что он пуст - C++
после удаления(перезаписи) данных из бинарного файла, файл всё равно существует, как сделать так чтобы и файл удалялся если он пустой?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.07.2014, 19:01
Ответ Создать тему
Опции темы

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