Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Как сделать функцию с необязательным параметром в СИ

#c #функции


Имеется функция вида 
f(p1, *p2, *p3, *p4) {
   ...
}

По указателям p3 и p4 присваиваются определённые значения, которые не всегда нужны
во внешней программе, т.е. эти аргументы, в отличие от p1 и p2, являются не обязательными.
Как можно реализовать на Си, чтобы можно было использовать эту функцию без "возвращения"
значений туда, на что указывают p3 и p4?
Например, чтобы можно было использовать как f(a1, &a2), так и f(a1, &a2, a3, a4)    


Ответы

Ответ 1



@Ilyazh, если еще актуально, то вот пример такой функции (из рабочей программы в Linux) static int check_args_nz(void *a, ...) { va_list ap; va_start(ap, a); int i; for (i = 0; a; i++) a = va_arg(ap, void *); va_end(ap); return i; } Для теста вызывать можно примерно так: int a = 1; char *b = "abc"; double c; printf ("%d %d %d\n", check_args_nz(0, "2", &a, 0), check_args_nz(&a, b, &b, &c, 0), check_args_nz((void *)a, 0)); результат: $ ./a.out 0 4 1 $

Ответ 2



Рискую оказаться не прав, давно с С дела не имел :) f(p1, *p2, *p3, *p4 = NULL) { //проверка p3 и p4 на NULL } f(p1,*p2,*p3 = NULL) { f(pi,p2,p3,NULL); } //можно использовать type a, b, c; f(1, &a); f(1, &a, &b); f(1, &a, &b, &c);

Ответ 3



Я бы завернул возврат в структуру struct f_result { int* p2; int* p3; int* p4; }; void f(int p1, f_result* result); Звать так: int p2; // сюда хотим возвращаемое значение p2 f_params p = {&p2}; // не заданные члены структуры автоматически получают нули f(100, &p); В синтаксисе могу несколько ошибаться, с голым Си мало дела имел.

Ответ 4



А не проще сделать так? void sum_and_product(int p1, int p2, int* p3, int* p4) { if( p3 ) { *p3 = p1 + p2; } if( p4 ) { *p4 = p1 * p2; } } int sum; int product; sum_and_product(2, 3, &sum, NULL); sum_and_product(1, 1, NULL, &product);

Ответ 5



Пример: Код: Function MyFunction(S: String): Boolean; OverLoad; Begin Form1.Caption:=S; MyFunction:=True; End; Function MyFunction(S1, S2: String): Boolean; OverLoad; Begin Form1.Caption:=S1; Form1.Button1.Caption:=S2; MyFunction:=True; End; Procedure TForm1.Button1Click(Sender: TObject); Begin MyFunction('Hello World!'); End; Procedure TForm1.Button2Click(Sender: TObject); Begin MyFunction('My Name Is ...', 'Say SomeThing...'); End; I am the First of Cyber Evolution... I am the First to Program your Future...

Комментариев нет:

Отправить комментарий