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

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

23.02.2017, 20:56. Показов 1117. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такая проблема есть код который должен выводить поочередно цифры, 1 2 3 4 5, я пытаюсь программировать в dev c++ и компилятор выводит 1 0 2 0 3, в чем может быть проблема, помогите разобраться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
 
using namespace std;
 
void sum(int num, int first, ...){
    
    int *ptr = &first;
    
    while (num--){
        cout << *ptr << endl;
        ptr++;
    }
}
 
int main(){
    sum(5, 1, 2, 3, 4, 5);
}
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2017, 20:56
Ответы с готовыми решениями:

Функции с переменным числом параметров
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; int max(int k,...) { int *p=&amp;k; int maxi; for(;k!=0;k--)

Функции с переменным числом параметров
Написать функцию prost с переменным числом параметров, которая находит все простые числа из нескольких интервалов. Интервалы задаются...

Функции с переменным числом параметров
Подскажите как работают функции с переменным числом параметров, как их составлять. Почитал немного в инете про это, кажется только больше...

16
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
23.02.2017, 21:09
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
template<typename T>
void show(T&& t) {
    cout<<t<<" ";
}
template<typename T, typename...Args>
void show(T&& t,Args&&...arg) {
    show(forward<T>(t));
    show(forward<Args>(arg)...);
}
int main() {
    show(1,2,3,4,5);
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
23.02.2017, 21:10
Golovano-v, Проблема в том, что это - UB. Для функций с переменным числом параметров есть специальные средства.
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
23.02.2017, 21:11
Вам нужно цифры наоборот вывести?
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
23.02.2017, 21:11
http://ci-plus-plus-snachala.ru/?p=63
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
23.02.2017, 21:16
Режимы трансляции какие?
В Студии 2012 в режиме 32-битной трансляции Release никаких нулей не выводит.
Как и положено в столбик 5 чисел.
0
1 / 1 / 0
Регистрация: 21.01.2017
Сообщений: 20
23.02.2017, 21:20  [ТС]
Peoples, спасибо, но хотелось бы услышать ответ по исходному коду, а не совсем другую программу

Добавлено через 3 минуты
ValeryLaptev, TDM-GCC 4.9.2 64-bit Release, если я конечно правильно понял))
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
23.02.2017, 21:22
Цитата Сообщение от Golovano-v Посмотреть сообщение
но хотелось бы услышать ответ по исходному коду
В сообщении #3 написано. Еще раз, для глухих. ТАК ДЕЛАТЬ НЕЛЬЗЯ, ЭТО - UB. Могут быть разные соглашения о вызовах. У параметра вообще может не быть адреса, он может передаваться через регистры. Для обработки переменного числа параметров есть специальные макросы
1
1 / 1 / 0
Регистрация: 21.01.2017
Сообщений: 20
23.02.2017, 21:22  [ТС]
Photofenix, нет мне нужно вывести 1 2 3 4 5, собственно как в теле main, но компилятор выводит 1 0 2 0 3
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
23.02.2017, 21:25
Проблема в том, что вы гуляете по памяти в надежде, что аргументы передаются через стек, во первых это не правильно с точки зрения безопасности(можно легко ошибиться и получить критическую уязвимость), во вторых никто не обязан гарантировать, что они передаются через стек, мой компилятор (gcc какой-то версии) скомпилировал вызов функции вот так(честно сказать я и сам не ожидал этого):
C++
1
2
3
4
5
6
7
8
mov     r9d, 5
        mov     r8d, 4
        mov     ecx, 3
        mov     edx, 2
        mov     esi, 1
        mov     edi, 5
        mov     eax, 0
        call    _Z3sumiiz
здесь видно, что аргументы передаются через регистры.
Какие умные нынче компиляторы пошли
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
23.02.2017, 21:31
Golovano-v, вообще-то тут правильно пишут, что так делать не надо.
В разных системах обычно получаются разные результаты.
В Студии 2012 выводится в столбик 1 1 0 2 0 3
0
1 / 1 / 0
Регистрация: 21.01.2017
Сообщений: 20
23.02.2017, 21:34  [ТС]
Спасибо всем откликнувшимся за помощь, avgoor, валерьяночки выпей, а то как -то вы агрессивно реагируете, это темы для новичков, и тупых вопросов тут достаточно, для того он и создан
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
23.02.2017, 21:35
DevAlone, ValeryLaptev, это зависит не от версии студии а от ABI.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
23.02.2017, 21:42
Цитата Сообщение от avgoor Посмотреть сообщение
DevAlone, ValeryLaptev, это зависит не от версии студии а от ABI.
Не от студии, но от компилятора, который выбирает, как передавать аргументы.
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
24.02.2017, 01:40
http://ideone.com/Sx2jtn

Последний писк моды:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
template <typename... Args>
void sum(Args&&... args) {
    (std::cout << ... << args) << std::endl;
}
 
int main() {
    sum(1,2,3,4,5);
}
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.02.2017, 16:45
Цитата Сообщение от DevAlone Посмотреть сообщение
Не от студии, но от компилятора, который выбирает, как передавать аргументы.
UB - такое UB,
что зависит только от звезд на небе,
и ни от чего более.

Golovano-v,
существует стандартный способ работы с функциями элипсисами:

смотрите пример использования:
http://www.cplusplus.com/refer... /va_start/
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
03.03.2017, 14:25
Цитата Сообщение от Voivoid Посмотреть сообщение
Последний писк моды:
Можно ещё так:
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
#include <iostream>
#include <initializer_list>
 
using std::cout;
using std::endl;
 
template <typename T>
void printArguments(std::initializer_list<T> args)
{
    for(const auto &arg : args) {
        cout << arg << " ";
    }
    cout << endl;
}
 
int main()
{
    printArguments({ 5, 3, 4 });
 
    printArguments<double>({ 1, 9, -11, 5.55 });
 
    printArguments({ 1.0, 9.0, -11.0, 5.55 });
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2017, 14:25
Помогаю со студенческими работами здесь

Функции с переменным числом параметров
Функция должна принимать переменное количество аргументов, последним из которых является 0, и скажем просто их печатает. Делаю по примеру...

Функции с переменным числом параметров
функции с переменным числом параметров в качестве параметра форматная строка,как задать это дело в Cи и что можно сказать преподу

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

Функции с переменным числом параметров
Добрый день, уважаемые знатоки С++! Подскажите пожалуйста, что не правильно в моем коде? Необходимо написать функцию с переменным...

Функции с переменным числом параметров
Написать функцию sum с переменным числом параметров, которая находит сумму чисел типа int по формуле: S=a1*a2+a3*a4+a5*a6+. . . . . ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru