Пример функций с переменным числом параметров
#include <iostream.h>
#include <stdio.h>
struct xxx
{ char x[9];
char xx[7]; //!!!!!!!!!!!!!!! :::: 4
};
/********************************
void main(){
int r[5]={5,4,3,2,1};
int rez;
xxx sss;
sss.x[0]='A'; sss.x[1]='B'; sss.x[2]='C'; sss.x[3]='D'; sss.x[4]='\0';
rez = fff(5,
"aaaaaaaaaa",
"bbbbbbbbbbb",
"cccccccccccc",
3.1415e+0,
"dddddddd",
666.666e+0,
r, 55555, sss,
555,
666);
*************************************/
// Задаем функцию с переменным числом параметров.
int fff(int n, ...)
{
// Получаем адрес первого параметра.
char *p;
p = (char *) &n;
int *p0=(int * ) p;
printf("p0=%d\n", *p0);
char **p1;
p1 = (char **) (p+sizeof(int));
printf("p1 =%s\n", *p1 );
char **p2;
p2 = (char **) (p + sizeof(int ) + sizeof( char *) );
printf("p2 =%s\n", *p2 );
char **p3;
p3 = (char **) (p + sizeof(int ) + sizeof(char *) + sizeof(char *));
printf("p3 =%s\n", *p3 );
double *p4;
p4 = (double *) (p + sizeof(int ) + sizeof(char *) + sizeof(char *) + sizeof(char
*));
printf("p4 =%e\n", *p4 );
char ** p5;
p5 = (char **) (p + sizeof(int) + sizeof(char *) + sizeof(char *) +
sizeof(char *) + sizeof(double) );
printf("p5 =%s\n", *p5 );
double * p6;
p6 = (double *) (p + sizeof(int) + sizeof(char *) + sizeof(char *) +
sizeof(char *) + sizeof(double) + sizeof(char *) );
printf("p6 =%e\n", *p6 );
int ** p7;
p7 = (int **) (p + sizeof(int) + sizeof(char *) + sizeof(char *) +
sizeof(char *) + sizeof(double) + sizeof(char *) + sizeof(double) );
for(int j=0; j<5; j++) printf("p7[%d]=%d \n", j, *( (*p7) +j) ); //(*p)[j]
int * p8;
p8 = (int *) (p + sizeof(int) + sizeof(char *) + sizeof(char *) +
sizeof(char *) + sizeof(double) + sizeof(char *)
+ sizeof(double) + sizeof(int *) );
printf("p8=%d\n",*p8 );
xxx * p9;
p9 = (xxx *) (p + sizeof(int) + sizeof(char *) + sizeof(char *) +
sizeof(char *) + sizeof(double) + sizeof(char *)
+ sizeof(double) + sizeof(int *) + sizeof(int) );
printf("p9=%s\n",(*p9).x );
int * p10;
p10 = (int *) (p + sizeof(int) + sizeof(char *) + sizeof(char *) +
sizeof(char *) + sizeof(double) + sizeof(char *)
+ sizeof(double) + sizeof(int *) + sizeof(int) + sizeof(xxx) );
printf("p10=%d\n",*p10 );
int * p11;
p11 = (int *) (p + sizeof(int) + sizeof(char *) + sizeof(char *) +
sizeof(char *) + sizeof(double) + sizeof(char *)
+ sizeof(double) + sizeof(int *) + sizeof(int) + sizeof(xxx)
+ sizeof(int) );
printf("p11=%d\n",*p11 );
return 0;
}
void f1(int * n, ...)
{
// Получаем адрес первого параметра.
char *p;
p =(char *) &n; // это адрес стека
int *p0; p0 =(int *) p; printf("p0=%d\n", *p0);
int *p1a;
int * temp; temp=(int *) ( p+sizeof(int *) );
p1a = temp; printf("p1a=%d\n", *p1a);
}
void main(){
int r[5]={5,4,3,2,1};
int rez;
xxx sss;
sss.x[0]='A'; sss.x[1]='B'; sss.x[2]='C'; sss.x[3]='D'; sss.x[4]='\0';
rez = fff(5, "aaaaaaaaaa", "bbbbbbbbbbb", "cccccccccccc",
3.1415e+0, "dddddddd", 666.666e+0,
r, 55555, sss,
555, 666);
int p1, p1a; double p2; char p3;
p1=55555; p1a=666;
printf("### &p1=%x \n", p1);
f1( &p1, 777, &p1a, &p2, &p3);
printf("f1==> p1=%d p1a=%d p2=%e, p3=%c\n", p1, p1a, p2, p3);
}