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

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

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.05.2013, 07:39     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #1
Например,
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++ Как записать элементы массива через запятую ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 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
Ушёл с форума.
 Аватар для 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
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 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
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
27.05.2013, 09:11     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #5
Подобной ерундой можно заниматься лишь при понимании того, что программа получится непереносимой.

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

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

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

Добавлено через 1 минуту
Другими словами, ответ на вопрос в общем случае: НЕТ. В частном случае (т.е. сознательное написание непереносимого гавнокода): ДА
taras atavin
Ушёл с форума.
 Аватар для 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
Ушёл с форума.
 Аватар для 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
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
27.05.2013, 21:06     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #9
Цитата Сообщение от taras atavin Посмотреть сообщение
С какого она должна стать не переносимой то?
А с чего ты решил, что она будет переносимой?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.05.2013, 07:14  [ТС]     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #10
А почему нет? Назови хоть одно препятствие.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
28.05.2013, 17:06     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
А почему нет? Назови хоть одно препятствие.
См. пост #5
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2013, 17:41     Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив?
Еще ссылки по теме:

C++ Имена аргументов в прототипе функции
C++ Есть функция которая добавляет элемент типа int в конец массива. Как ее переделать через шаблон
C++ В функцию передается несколько целых чисел. Создать из всех параметров динамический массив и вернуть указатель

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

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

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