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

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

Восстановить пароль Регистрация
 
yapopovko
 Аватар для yapopovko
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 37
10.09.2010, 00:49     Функция с переменным количеством аргументов вызывает out of memory #1
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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2010, 00:49     Функция с переменным количеством аргументов вызывает out of memory
Посмотрите здесь:

Функции с переменным числом аргументов C++
C++ Функция с переменным количеством параметров-оъектов
Шаблоны с переменным числом аргументов C++
Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)? C++
C++ Функция с переменным кол-вом аргументов char vs int
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
10.09.2010, 09:00     Функция с переменным количеством аргументов вызывает out of memory #2
Я бы не рекомендовал объекты С++ (не POD) передавать функции с переменным числом аргументов. Они побитно копируются на стек, для них даже копи-конструкторы не вызываются.

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

alexzak, по идее передача по ссылке объектов будет рабоать нормально. При этом стандартная ссылка C++ работать скорее всего не будет (потому что компилятор никак не сможет понять, нужно передавать по значению или по ссылке), а потому нужно передавать через указатель.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.09.2010, 18:41     Функция с переменным количеством аргументов вызывает out of memory #5
yapopovko, если в функцию непонятное количество строк передаётся, почему бы их, как-то так не передавать?
C++
1
property(short nesting_c, std::list<std::string>& strlist){...}
При чём первой строкой в этом strlist помещать то, что изначально, как string & name_c передавалось, второй то, что было в string & level1, ну и далее по списку...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
10.09.2010, 19:00     Функция с переменным количеством аргументов вызывает out of memory #6
easybudda, конерктно в данном случае это спасёт. А в общем (т.е. передача экземпляров классов разных типов) - проблема остаётся. Надо как-то подумать над этим. Я не совсем понимаю, почему оно не должно работать, ведь копирование происходит как в момент вызова, так и в момент чтения через va_arg
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.09.2010, 19:30     Функция с переменным количеством аргументов вызывает out of memory #7
Я немного не понимаю, если ТС передает строки по ссылке, то почему здесь:
C++
1
cout << va_arg(p, string)
а не:
C++
1
cout << va_arg(p, string&)
Сейчас попробую второй вариант.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.09.2010, 19:31     Функция с переменным количеством аргументов вызывает out of memory #8
Evg, там по-моему основная засада в том, что типы параметров не передаются. Если попробовать приводить указатели на объекты к типу void*, а первым параметром эти самые типы объектов и определять (примерно так же, как в printf() формат первой строкой передаётся), может что и получится...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2010, 19:39     Функция с переменным количеством аргументов вызывает out of memory
Еще ссылки по теме:

C++ GCC и функции с переменным числом аргументов
C++ Функция с неограниченным количеством аргументов
Функция с переменным количеством параметров C++

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.09.2010, 19:39     Функция с переменным количеством аргументов вызывает out of memory #9
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сейчас попробую второй вариант.
Не катит, все таки через эллепссис легально можно передавать только POD'ы:
cannot pass objects of non-POD type 'struct std::string' through '...'; call will abort at runtime
Yandex
Объявления
10.09.2010, 19:39     Функция с переменным количеством аргументов вызывает out of memory
Ответ Создать тему
Опции темы

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