#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...
Комментариев нет:
Отправить комментарий