Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

27.05.2013, 07:39. Просмотров 703. Ответов 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 минуту
Есть какое нибудь соглашение о вызовах, гарантирующее, что все параметры будут в определённом порядке помещены в стек? И можно как то указать, что функция должна быть под этим соглашением?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 07:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив? (C++):

Передать функции массив как несколько параметров - C++
Как передать функции массив как несколько параметров те где каждый элемент будет выступать как отдельный параметр

Несколько параметров $_POST через запятую - PHP
Нужно что бы пользователь в форме через запятую ввёл значения ключей массива, и далее проводить арифметические действия со значениями этих...

Получить строку из целых чисел, записанных через пробел, в которой перечислены номиналы монет - Turbo Pascal
Центральный банк для удобства денежного обращения хочет выпустить новые монеты, номинал каждой монеты должен измеряться целым числом...

Массив: Выведите на экран таблицу, в которой перечислены элементы массива (без повторений, в порядке убывания) - Free Pascal
Дан одномерный массив натуральных чисел. Выведите на экран таблицу, в которой перечислены элементы массива (без повторений, в порядке...

Дан одномерный массив натуральных чисел. Выведите на экран таблицу, в которой перечислены элементы массива (бе - Pascal
Дан одномерный массив натуральных чисел. Выведите на экран таблицу, в которой перечислены элементы массива (без повторений, в порядке...

Как задать последовательность слов через запятую, в конце точка через массив? - C (СИ)
помогите

11
zitxbit
88 / 740 / 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;
}
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.05.2013, 08:37  [ТС] #3
Цитата Сообщение от zitxbit Посмотреть сообщение
double max(int n, double x1,...)
Нет. Фиксированное количество параметров и безо всякого n.
0
zss
Модератор
Эксперт С++
6516 / 6078 / 2001
Регистрация: 18.12.2011
Сообщений: 15,808
Завершенные тесты: 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;
}
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,593
Записей в блоге: 28
27.05.2013, 09:11 #5
Подобной ерундой можно заниматься лишь при понимании того, что программа получится непереносимой.

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

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

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

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

Добавлено через 2 минуты
Соглашениями о вызовах не системы и не процессоры занимаются, на низком уровне параметров вообще нет, а есть стек, регистры и статическая память.
0
_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** . В других реализациях работать не будет.
Гарантируется только что массивы в куче и стеке будут идти по порядку.

В реализации у микрософта и объекты в куче идут по порядку.
0
taras atavin
3570 / 1753 / 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, или нет?
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,593
Записей в блоге: 28
27.05.2013, 21:06 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
С какого она должна стать не переносимой то?
А с чего ты решил, что она будет переносимой?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.05.2013, 07:14  [ТС] #10
А почему нет? Назови хоть одно препятствие.
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,593
Записей в блоге: 28
28.05.2013, 17:06 #11
Цитата Сообщение от taras atavin Посмотреть сообщение
А почему нет? Назови хоть одно препятствие.
См. пост #5
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.05.2013, 17:41  [ТС] #12
Слив защитан, переносимость доказана.
0
28.05.2013, 17:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2013, 17:41
Привет! Вот еще темы с ответами:

Получение параметров через запятую - SQL Server
Здравствуйте. В хранимую процедуру передаётся строка, на пример: &quot;0,1,2,546,101,6,9&quot; Нужно эту строку разобрать по запятым и каждое...

Как можно данные из нескольких ячеек записать в одну через запятую? - VBA
Подскажите, пожалуйста, как можно данные из нескольких ячеек записать в одну через запятую?

Как вывести массив в строку через запятую? - C#
Пытаюсь сделать задание, но возник вопрос как вывести массив в строку чрез запятую в textBox? Нашёл только вот это... Split(new...

как добавить несколько записей из таблицы в ячейку другой таблицы через запятую на дельфи - Delphi БД
имеется бд кулинарная книга, где при добавлении блюда, продукты добавлялись через запятую, по выбору из другой таблицы(список продуктов)......


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

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

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