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

параметры фунции - C++

Восстановить пароль Регистрация
 
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
19.12.2009, 23:21     параметры фунции #1
вот у меня возник вопрос,например фунция printf,сколько имеет параметров?
может у меня такой код
C++
1
printf("%d, %d, %d, %d, %d", 10,11,12,13,14);
или же может у меня код такой
C++
1
printf("hello");
то есть почему в некоторых функциях в момент вызова можно не написать все параметры,а у меня когда я пишу функции с двумяпараметрами то надо объязательно использовать 2?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2009, 23:21     параметры фунции
Посмотрите здесь:

C++ Фунции-процедуры.
C++ Фунции на С.
C++ C++, используем фунции. Жду ваших вариантов.
Фунции sin и cos C++
итераты как аргументы в фунции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
19.12.2009, 23:41     параметры фунции #2
наверное там константы стоят, они изменяются, когда передавать значение, а printf юзает ссылки на переменные, следовательно пытаються делать операции с сылками со значением 0, что критично..
лучше будет если вы почитаете соответствующую литературу..
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
20.12.2009, 00:13     параметры фунции #3
Функция printf определена как int printf(const char* format, ...); , то есть, имеет переменное число аргументов: строка формата обязательна, а дальше можно передавать сколько хочешь. Если ты передашь больше, чем нужно, ненужные значения будут проигнорированы. Если передашь меньше, printf всё равно возьмёт нужные значения со стека, но это будет неизвестно что (скорее всего, локальные переменные вызвавшей функции). Переменное число параметров - вещь удобная, но опасная, поскольку ошибки выявляются только во время исполнения. Функция printf только читает переданные ей данные, поэтому максимальный риск заключается в том, что выведется неправильный текст (в случае с %s это может быть довольно большое количество неправильного текста) или будет попытка чтения из запрещённых областей памяти, что приведёт к аварийному останову программы. scanf пишет в память, поэтому к ассортименту добавляются такие эзотерические вещи, как изменение произвольных участков в памяти, включая любые переменные любых функций, разрушение программного кода и другие весёлые штукесы.
Вдохновившись этими блистательными перспективами, новичок может спросить: "А что, эти функции такие уникальные? Или я тоже могу писать свои функции с переменным числом аргументов?" Ответ - да, можете. Смотрите хелп по stdarg.h и макросам va_list и va_arg. Помимо самих аргументов, вам придётся как-то определять их тип и количество (printf делает это по строке формата).
Второй вопрос, связанный с этой темой - "а могу ли я написать функцию с переменным числом аргументов, которая передаёт их в другую функцию с переменным числом аргументов, например, тому же printf?" Ответ - можно, но не напрямую. Такой функции надо будет уже передавать сам va_list. Самому printf такое уже не передашь, но специально для этих целей есть vprintf.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.12.2009, 00:21     параметры фунции #4
Цитата Сообщение от МедведЪ Посмотреть сообщение
фунция printf,сколько имеет параметров?
она имеет всего один аргумент. остальные это алиасы. Тут описано: http://www.citforum.ru/programming/c/h15.shtml

а конечное кол-во допустимых для использования формальных аргументов зависит от компилятора и реализации CRT, и еще от чего-то, не помню)
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 13:32  [ТС]     параметры фунции #5
Nick Alte, приведите пожалуйста пример с va_list
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
20.12.2009, 14:01     параметры фунции #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdarg.h>
 
double maxd(int amount, ...)
{
    va_list args;
    va_start(args, amount);
    double maxval = va_arg(args, double);
    for(int i=1; i<amount; ++i)
    {
        double nextval = va_arg(args, double);
        if(nextval>maxval)
            maxval = nextval;
    }
    return maxval;
}
 
 
int main()
{
    printf("%f\n", maxd(3, 3.1, 6.2, 2.3));
    printf("%f\n", maxd(5, 3.1, 4.2, 1.3, 5.4, 0.5));
}
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 14:02  [ТС]     параметры фунции #7
а с коментами можно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2009, 14:10     параметры фунции
Еще ссылки по теме:

Ссылка на элементы фунции мэин , в дополнительной фунции C++
C++ вызов шаблонной фунции
C++ Двумерный массив и фунции

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
20.12.2009, 14:10     параметры фунции #8
вот это скорость...
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
30
31
32
33
34
35
36
#include <stdio.h>
// Подключаем заголовок для работы с переменным числом аргументов
#include <stdarg.h>
 
// Объявляем функцию для поиска максимума на переменном количестве аргументов типа double
// Количество аргументов передаём явно, в amount
// Переменное количество аргументов обозначаем троеточием (которое называется эллипсис).
double maxd(int amount, ...)
{
// Указатель на очередной аргумент
    va_list args;
// Инициализируем этот указатель, передав в макрос последний именованный аргумент
    va_start(args, amount);
// Извлекаем первый неименованный аргумент для инициализации текущего максимума
// Здесь есть натяжка: не проверяется, передан ли хоть один аргумент. Это для простоты.
// По-хорошему, функцию надо было объявлять как double maxd(int amount, double val1, ...)
// и проверять amount.
// При извлечении аргумента значение указателя args обновляется. Если нам нужно снова
// извлекать значения, надо снова установить его через va_start
    double maxval = va_arg(args, double);
    for(int i=1; i<amount; ++i)
    {
// В цикле последовательно извлекаем значения неименованных аргументов и определяем максимум.
        double nextval = va_arg(args, double);
        if(nextval>maxval)
            maxval = nextval;
    }
    return maxval;
}
 
int main()
{
// Проверяем работу функции с 3 и 5 значениями
    printf("%f\n", maxd(3, 3.1, 6.2, 2.3));
    printf("%f\n", maxd(5, 3.1, 4.2, 1.3, 5.4, 0.5));
}
Yandex
Объявления
20.12.2009, 14:10     параметры фунции
Ответ Создать тему
Опции темы

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