Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Функция с переменным количеством аргументов вызывает out of memory - C++

10.09.2010, 00:49. Просмотров 931. Ответов 8
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
property(string & name_c, short nesting_c, string & level1, ...)
    {
        nesting=nesting_c;
        name=name_c;
        va_list p;
        va_start(p, level1);
        vector<string> levels_c(nesting_c-1); //так как первый элемент - нулевой
        levels_c.insert(levels_c.begin(),level1);
        iterPrint<10>(levels_c.begin(),levels_c.end());
        string vspom;
        for(; nesting_c; nesting_c--){
            cout<<va_arg(p, string);
            cout<<vspom;
            levels_c.insert(levels_c.begin(),vspom);
        }
        //levels=levels_c;
    }
И при этом:
C++
1
2
3
4
5
6
7
string c1="teststring";
    string c2="test";
    cout<<sizeof(string)<<' ';
    cout<<sizeof(c1)<<' ';
    cout<<sizeof(c2)<<' ';
Даст результат:
28 28 28
Следовательно, смещение при использовании va_arg каждый раз должно быть одинаковым. Но возникает ошибка "Out of memory". Что не так? Почему?
Если не string, то что использовать для передачи строк? Возможно ли использовать массивы char?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2010, 00:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция с переменным количеством аргументов вызывает out of memory (C++):

Шаблон функции с переменным количеством аргументов - C++
Добрый вечер, мне необходимо при помощи шаблона функции реализовать поиск минимального числа(тип данных не известен, количество чисел...

Шаблонная функция с переменным числом аргументов - C++
Сабж. Каким образом можно запретить использование шаблонной функции, если тип одного из аргументов не соответствует требуемому? Есть...

Функция с переменным количеством параметров - C++
Здравствуйте, возникла вот такая проблема: создаю функцию с переменным кол-ом параметров. Пример сделан мною по аналогии с...

Функция с переменным количеством параметров - C++
Доброго времени суток! Я озадачился таким вопросом - как производится компиляция функций с переменным числом параметров? Компилятор создаёт...

Функция с переменным числом аргументов (через шаблоны) - C++
Доброго времени суток! Встал вопрос с реализацией такой функции. template&lt;typename... Args&gt; returntype functionname(const Args&amp;......

Функция суммы с переменным количеством параметров - C++
На просторах форума нашёл код. Стало интересно посмотреть что выводят его отдельные части(отдельно переменная t, sum одного из аргументов и...

8
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
10.09.2010, 09:00 #2
Я бы не рекомендовал объекты С++ (не POD) передавать функции с переменным числом аргументов. Они побитно копируются на стек, для них даже копи-конструкторы не вызываются.

Функции с переменным числом аргументов пришли из С, и работают они только для POD (plain old data) типов. std::string не является POD.
0
yapopovko
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 37
10.09.2010, 13:09  [ТС] #3
Спасибо. Попробую пойти путём процедурного полиморфизма.
0
Evg
Эксперт CАвтор FAQ
18705 / 6673 / 472
Регистрация: 30.03.2009
Сообщений: 18,684
Записей в блоге: 29
10.09.2010, 18:36 #4
yapopovko, для порядку бы надо весь код покаывать, когда есть проблема

alexzak, по идее передача по ссылке объектов будет рабоать нормально. При этом стандартная ссылка C++ работать скорее всего не будет (потому что компилятор никак не сможет понять, нужно передавать по значению или по ссылке), а потому нужно передавать через указатель.
0
easybudda
Модератор
Эксперт CЭксперт С++
9917 / 5840 / 976
Регистрация: 25.07.2009
Сообщений: 11,014
10.09.2010, 18:41 #5
yapopovko, если в функцию непонятное количество строк передаётся, почему бы их, как-то так не передавать?
C++
1
property(short nesting_c, std::list<std::string>& strlist){...}
При чём первой строкой в этом strlist помещать то, что изначально, как string & name_c передавалось, второй то, что было в string & level1, ну и далее по списку...
0
Evg
Эксперт CАвтор FAQ
18705 / 6673 / 472
Регистрация: 30.03.2009
Сообщений: 18,684
Записей в блоге: 29
10.09.2010, 19:00 #6
easybudda, конерктно в данном случае это спасёт. А в общем (т.е. передача экземпляров классов разных типов) - проблема остаётся. Надо как-то подумать над этим. Я не совсем понимаю, почему оно не должно работать, ведь копирование происходит как в момент вызова, так и в момент чтения через va_arg
0
CyBOSSeR
Эксперт С++
2307 / 1680 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.09.2010, 19:30 #7
Я немного не понимаю, если ТС передает строки по ссылке, то почему здесь:
C++
1
cout << va_arg(p, string)
а не:
C++
1
cout << va_arg(p, string&)
Сейчас попробую второй вариант.
0
easybudda
Модератор
Эксперт CЭксперт С++
9917 / 5840 / 976
Регистрация: 25.07.2009
Сообщений: 11,014
10.09.2010, 19:31 #8
Evg, там по-моему основная засада в том, что типы параметров не передаются. Если попробовать приводить указатели на объекты к типу void*, а первым параметром эти самые типы объектов и определять (примерно так же, как в printf() формат первой строкой передаётся), может что и получится...
0
CyBOSSeR
Эксперт С++
2307 / 1680 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.09.2010, 19:39 #9
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сейчас попробую второй вариант.
Не катит, все таки через эллепссис легально можно передавать только POD'ы:
cannot pass objects of non-POD type 'struct std::string' through '...'; call will abort at runtime
0
10.09.2010, 19:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2010, 19:39
Привет! Вот еще темы с ответами:

Функция с переменным количеством параметров-оъектов - C++
Нашел на форуме пример функции с переменным количеством int, подскажите как переписать ее для передачи числа параметров-объектов...

Функция с переменным кол-вом аргументов char vs int - C++
#include &lt;iostream&gt; #include &lt;cstdio&gt; using namespace std; void func (int amount, ...)

Функция с неограниченным количеством аргументов - C++
Вообщем проблема: написал функцию неограниченным количеством аргументов под виндой (компилятор mingw) все работает как часы, но под unix...

Шаблоны с переменным числом аргументов - C++
Написал шаблон функции с переменным числом аргументов которая считает сумму своих аргументов. Практики по этому вопросу не имею, поэтому...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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