1 / 1 / 0
Регистрация: 21.01.2017
Сообщений: 20
1

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

23.02.2017, 20:56. Показов 781. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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; ...

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

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

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

16
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
23.02.2017, 21:09 2
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
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
23.02.2017, 21:10 3
Golovano-v, Проблема в том, что это - UB. Для функций с переменным числом параметров есть специальные средства.
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
23.02.2017, 21:11 4
Вам нужно цифры наоборот вывести?
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
23.02.2017, 21:11 5
http://ci-plus-plus-snachala.ru/?p=63
1
Эксперт С++
1067 / 846 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
23.02.2017, 21:16 6
Режимы трансляции какие?
В Студии 2012 в режиме 32-битной трансляции Release никаких нулей не выводит.
Как и положено в столбик 5 чисел.
0
1 / 1 / 0
Регистрация: 21.01.2017
Сообщений: 20
23.02.2017, 21:20  [ТС] 7
Peoples, спасибо, но хотелось бы услышать ответ по исходному коду, а не совсем другую программу

Добавлено через 3 минуты
ValeryLaptev, TDM-GCC 4.9.2 64-bit Release, если я конечно правильно понял))
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
23.02.2017, 21:22 8
Цитата Сообщение от Golovano-v Посмотреть сообщение
но хотелось бы услышать ответ по исходному коду
В сообщении #3 написано. Еще раз, для глухих. ТАК ДЕЛАТЬ НЕЛЬЗЯ, ЭТО - UB. Могут быть разные соглашения о вызовах. У параметра вообще может не быть адреса, он может передаваться через регистры. Для обработки переменного числа параметров есть специальные макросы
1
1 / 1 / 0
Регистрация: 21.01.2017
Сообщений: 20
23.02.2017, 21:22  [ТС] 9
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 10
Проблема в том, что вы гуляете по памяти в надежде, что аргументы передаются через стек, во первых это не правильно с точки зрения безопасности(можно легко ошибиться и получить критическую уязвимость), во вторых никто не обязан гарантировать, что они передаются через стек, мой компилятор (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
Эксперт С++
1067 / 846 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
23.02.2017, 21:31 11
Golovano-v, вообще-то тут правильно пишут, что так делать не надо.
В разных системах обычно получаются разные результаты.
В Студии 2012 выводится в столбик 1 1 0 2 0 3
0
1 / 1 / 0
Регистрация: 21.01.2017
Сообщений: 20
23.02.2017, 21:34  [ТС] 12
Спасибо всем откликнувшимся за помощь, avgoor, валерьяночки выпей, а то как -то вы агрессивно реагируете, это темы для новичков, и тупых вопросов тут достаточно, для того он и создан
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
23.02.2017, 21:35 13
DevAlone, ValeryLaptev, это зависит не от версии студии а от ABI.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
23.02.2017, 21:42 14
Цитата Сообщение от avgoor Посмотреть сообщение
DevAlone, ValeryLaptev, это зависит не от версии студии а от ABI.
Не от студии, но от компилятора, который выбирает, как передавать аргументы.
1
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
24.02.2017, 01:40 15
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
Эксперт С++
8718 / 4299 / 957
Регистрация: 15.11.2014
Сообщений: 9,743
24.02.2017, 16:45 16
Цитата Сообщение от 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 17
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2017, 14:25
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru