Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 71

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

02.02.2019, 13:22. Показов 1001. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Имеется код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void show_it(int a, ...)
{      
    int* pa = &a;
    int i=0;
    while(i!=6)
    {
        std::cout<<*pa<<'\n';
        pa++;        
        i++;
    }   
}
 
int main(int argc, char **argv)
{
show_it(1, 2, 3, 4, 5, 6);
return 0;
}
Выводит в консоль
1
0
2
0
3
0
Если код исправить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void show_it(int a, ...)
{      
    int* pa = &a;
    int i=0;
    while(i!=6)
    {
        std::cout<<*pa<<'\n';
        pa+=2;        
        i++;
    }   
}
 
int main(int argc, char **argv)
{
show_it(1, 2, 3, 4, 5, 6);
return 0;
}
То выводит все как нужно. Кто-нибудь может подсказать, в чем может быть проблема?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2019, 13:22
Ответы с готовыми решениями:

Функция с переменным количеством аргументов вызывает out of memory
property(string &amp; name_c, short nesting_c, string &amp; level1, ...) { nesting=nesting_c; name=name_c; va_list p; ...

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

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

6
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
02.02.2019, 14:00
В VS 2017 такого эффекта нет.
Может быть в Вашем компиляторе константы 1,2,3... занимают вдвое больше памяти, чем переменная int.
Попробуйте
C++
1
2
    int x = 1;
    show_it(x, x+1, x+2, x+3, x+4, x+5);
или даже
C++
1
2
    int x = 1;
    show_it(x, x, x, x, x, x);
У меня, если написать так
C++
1
2
    long long x = 1;
    show_it(x, x+1, x+2, x+3, x+4, x+5);
то выводится
1
2
0
3
0
4
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
02.02.2019, 14:42
Isaev_Ivan, не ищите приключений на свою задницу. Используйте стандартные Variadic functions. Это гарантирует корректную работу как для различных компиляторов, так и для различных целевых платформ.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstdarg>
 
using namespace std;
 
void show_it(int a, ...) {
    va_list args;
    va_start(args, a);
    cout << a << '\n';
    for (int i = 0; i < 5; ++i) {
        cout << va_arg(args, int) << '\n';
    }
    va_end(args);
}
 
int main(int argc, char **argv) {
    show_it(1, 2, 3, 4, 5, 6);
    return 0;
}
Цитата Сообщение от zss Посмотреть сообщение
В VS 2017 такого эффекта нет.
Есть. При компиляции для х64.

Детали можно посмотреть на https://godbolt.org/.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
02.02.2019, 15:45
Цитата Сообщение от L0M Посмотреть сообщение
Используйте стандартные Variadic functions
Или тоже самое можно проделать более безопасным способом через вариативные шаблоны.
Например, вот так (С++17):
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
template<typename... Args>
void show_it(const Args &... args) 
{
    ((std::cout << args << std::endl), ...);
}
 
int main()
{
    show_it(1, 2, 3, 4.5, "abc", 6);
}
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
02.02.2019, 16:33
Isaev_Ivan, привет!
Переменное число аргументов можно передать в функцию, запаковав их в контейнер, например, в vector<T>.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
using namespace std;
 
void show_it(const vector<int> &a)
{
    for (const auto &value : a)
    {
        cout << value << endl;
    }
}
 
int main()
{
show_it(vector<int>{1,2,3,4,5});
return 0;
}
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
02.02.2019, 16:57
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Или тоже самое можно проделать более безопасным способом через вариативные шаблоны.
Это не то же самое.
0
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 71
02.02.2019, 19:05  [ТС]
Спасибо, буду разбираться!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2019, 19:05
Помогаю со студенческими работами здесь

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

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

Функция с переменным количеством параметром
Задание: сделать функцию с переменным количеством параметров, которые (возможно, кроме первого) есть символьными строками. Функция должна...

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru