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

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? - C++

27.05.2013, 07:39. Просмотров 676. Ответов 11
Метки нет (Все метки)

Например,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double max(double x1, double x2, double x3, double x4)
{
 int m;
 int i;
 double *a;
 a=&x1;
 for (i=3, m=0; i>0; --i)
 {
  if (a[i]>a[m])
  {
   m=i;
  }
 }
 return a[m];
}
?

Добавлено через 1 минуту
Есть какое нибудь соглашение о вызовах, гарантирующее, что все параметры будут в определённом порядке помещены в стек? И можно как то указать, что функция должна быть под этим соглашением?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 07:39     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив?
Посмотрите здесь:
Передать функции массив как несколько параметров C++
C++ Функция с переменным числом параметров, как узнать кличество переданных параметров?
C++ Как будут инициализированы переменные в теле функции и вне тела функции?
C++ Имена аргументов в прототипе функции
C++ Введенные через запятую числа, преобразовать в одномерный массив
C++ Переменная ссылочного типа в прототипе функции
Как вывести на экран переменную из функции, которой присваиваеться значение через указатель? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
87 / 739 / 75
Регистрация: 11.04.2012
Сообщений: 971
27.05.2013, 07:45     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #2
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
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
#define N 10
 
double max(int n, double x1,...);
 
int main(int argc, char* argv[])
{
    printf("%f\n",max(5, 0.5, 0.6, 0.1, 0.3, 0.2));
 
    _getch();
 
    return 0;
}
 
double max(int n, double x1,...)
{
    double max = 0;
    double* pd = &x1; int i = n;
    while (pd != NULL && i >= 0)
    {
        if (*pd > max) max = *pd;
        pd++; i--;
    }
 
    return max;
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.05.2013, 08:37  [ТС]     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #3
Цитата Сообщение от zitxbit Посмотреть сообщение
double max(int n, double x1,...)
Нет. Фиксированное количество параметров и безо всякого n.
zss
Модератор
Эксперт С++
6278 / 5881 / 1902
Регистрация: 18.12.2011
Сообщений: 15,080
Завершенные тесты: 1
27.05.2013, 08:49     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #4
Вышеописанный способ работает и для фиксированного числа параметров
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
double max(double x1,double x2,double x3,double x4,double x5);
int main()
{
    printf("%f\n",max(0.5, 0.6, 0.1, 0.3, 0.2));
    _getch();
    return 0;
}
double max(double x1,double x2,double x3,double x4,double x5)
{
    double max = 0;
    double* pd = &x1; int i = 5;
    while (i>0)
    {
        if (*pd > max) max = *pd;
        pd++; i--;
    }
    return max;
}
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
27.05.2013, 09:11     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #5
Подобной ерундой можно заниматься лишь при понимании того, что программа получится непереносимой.

В своё время про подобные вещи уже писалось:

Оригинальная статья:
Как перенести параметры из ф-ции printf() в самодельную

Мои комментарии:
В той же самой теме посты 27, 28, 70, 73, 76

Добавлено через 1 минуту
Другими словами, ответ на вопрос в общем случае: НЕТ. В частном случае (т.е. сознательное написание непереносимого гавнокода): ДА
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.05.2013, 09:20  [ТС]     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #6
Цитата Сообщение от Evg Посмотреть сообщение
Подобной ерундой можно заниматься лишь при понимании того, что программа получится непереносимой.
С какого она должна стать не переносимой то?

Добавлено через 2 минуты
Соглашениями о вызовах не системы и не процессоры занимаются, на низком уровне параметров вообще нет, а есть стек, регистры и статическая память.
_Mutex
Заблокирован
27.05.2013, 09:48     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #7
Цитата Сообщение от zss Посмотреть сообщение
Вышеописанный способ работает и для фиксированного числа параметров
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
double max(double x1,double x2,double x3,double x4,double x5);
int main()
{
    printf("%f\n",max(0.5, 0.6, 0.1, 0.3, 0.2));
    _getch();
    return 0;
}
double max(double x1,double x2,double x3,double x4,double x5)
{
    double max = 0;
    double* pd = &x1; int i = 5;
    while (i>0)
    {
        if (*pd > max) max = *pd;
        pd++; i--;
    }
    return max;
}
Скорее всего это писалось на VS 20** . В других реализациях работать не будет.
Гарантируется только что массивы в куче и стеке будут идти по порядку.

В реализации у микрософта и объекты в куче идут по порядку.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.05.2013, 10:22  [ТС]     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #8
Цитата Сообщение от zss Посмотреть сообщение
Вышеописанный способ работает и для фиксированного числа параметров
C++
1
2
3
4
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
double max(double x1,double x2,double x3,double x4,double x5);
Ага. А потом вдруг оптимизатор подсунет fascall и половина параметров улетит в регистры.

Добавлено через 2 минуты
Лучше скажите, это:
C++
1
__stdcall int Max (int x1, int x2, int x3, int x4, int x5);
означает что функция всегда будет в соглашении stdcall, или нет?
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
27.05.2013, 21:06     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #9
Цитата Сообщение от taras atavin Посмотреть сообщение
С какого она должна стать не переносимой то?
А с чего ты решил, что она будет переносимой?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.05.2013, 07:14  [ТС]     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #10
А почему нет? Назови хоть одно препятствие.
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
28.05.2013, 17:06     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
А почему нет? Назови хоть одно препятствие.
См. пост #5
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2013, 17:41     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив?
Еще ссылки по теме:
Может ли переменная X использоваться как счётчик в цикле, в теле которого вычисляется заданная функция? C++
C++ Есть функция которая добавляет элемент типа int в конец массива. Как ее переделать через шаблон
C++ Как в теле функции узнать длину передаваемого ей массива?
C++ Как записать элементы массива через запятую ?
C++ В функцию передается несколько целых чисел. Создать из всех параметров динамический массив и вернуть указатель

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.05.2013, 17:41  [ТС]     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #12
Слив защитан, переносимость доказана.
Yandex
Объявления
28.05.2013, 17:41     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив?
Ответ Создать тему
Опции темы

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