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

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

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

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

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

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

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

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

Функция видит пустой вектор, хотя он заполнен - C++
В начале программы объявляю вектор, в функции main инициализирую, заполняю его с использованием внешней переменной в функции...

Ошибка при возвращении ссылки из функции - C++
Когда функция возвращает ссылку, то ее можно использовать с левой стороны от знака "=". Только не пойму почему не работает ...

-1.#IND при возвращении значения функции - C++
#include<iostream> using namespace std; float res=0; float number() { char c=cin.get(); if(c>='0' && c<='9') { ...

Конструктор копии при возвращении объекта - C++
main(): #include"Class_Taxi.h" #include<vld.h> #include<iostream> #include<locale.h> #define MAX 15 using namespace std; ...

Ошибка bad ptr при возвращении занчения из функции - C++
Помогите по функции, не возвращает значения, вот как объявлена функция и вот как пытаюсь вызвать чтобы получить значение этой самой функции...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Voivoid
673 / 276 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
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
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
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
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
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++
Реализация класса: #include&quot;Class_Taxi.h&quot; #include&lt;fstream&gt; #include&lt;conio.h&gt; using namespace std; Zakaz::Zakaz() { ...

Вектор: вставить новый элемент после последнего положительного - C++
Дан вектор из n элементов, которые считываются с клавиатуры, Вставить новый элемент после последнего положительного.

Программа выводит только 1 знак после запятой, хотя должна выводить больше - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){ setlocale(LC_ALL, &quot;Russian&quot;); ...

Проверка пуст ли массив? - C++
В операторе ввода класса хотел реализовать проверку на то пуст массив или нет, и ели НЕТ то очистить его,чтобы создать по-новой. Логично,...

Проверить, пуст ли файл - C++
Как можно проверить пустоту файла? Поиск юзал. Добавлено через 17 минут fstream f; f.open(&quot;f.txt&quot;,ios::in);//открываем поток для...


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

Или воспользуйтесь поиском по форуму:
DrOffset
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
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 другая информация
Ответ Создать тему
Опции темы

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