📄 memory.c
字号:
#ifdef ANSI_C
/* To allocate memory to many arguments.
The function should be called:
v_get_vars(dim,&x,&y,&z,...,NULL);
where
int dim;
VEC *x, *y, *z,...;
The last argument should be NULL !
dim is the length of vectors x,y,z,...
returned value is equal to the number of allocated variables
Other gec_... functions are similar.
*/
int v_get_vars(int dim,...)
{
va_list ap;
int i=0;
VEC **par;
va_start(ap, dim);
while (par = va_arg(ap,VEC **)) { /* NULL ends the list*/
*par = v_get(dim);
i++;
}
va_end(ap);
return i;
}
int iv_get_vars(int dim,...)
{
va_list ap;
int i=0;
IVEC **par;
va_start(ap, dim);
while (par = va_arg(ap,IVEC **)) { /* NULL ends the list*/
*par = iv_get(dim);
i++;
}
va_end(ap);
return i;
}
int m_get_vars(int m,int n,...)
{
va_list ap;
int i=0;
MAT **par;
va_start(ap, n);
while (par = va_arg(ap,MAT **)) { /* NULL ends the list*/
*par = m_get(m,n);
i++;
}
va_end(ap);
return i;
}
int px_get_vars(int dim,...)
{
va_list ap;
int i=0;
PERM **par;
va_start(ap, dim);
while (par = va_arg(ap,PERM **)) { /* NULL ends the list*/
*par = px_get(dim);
i++;
}
va_end(ap);
return i;
}
/* To resize memory for many arguments.
The function should be called:
v_resize_vars(new_dim,&x,&y,&z,...,NULL);
where
int new_dim;
VEC *x, *y, *z,...;
The last argument should be NULL !
rdim is the resized length of vectors x,y,z,...
returned value is equal to the number of allocated variables.
If one of x,y,z,.. arguments is NULL then memory is allocated to this
argument.
Other *_resize_list() functions are similar.
*/
int v_resize_vars(int new_dim,...)
{
va_list ap;
int i=0;
VEC **par;
va_start(ap, new_dim);
while (par = va_arg(ap,VEC **)) { /* NULL ends the list*/
*par = v_resize(*par,new_dim);
i++;
}
va_end(ap);
return i;
}
int iv_resize_vars(int new_dim,...)
{
va_list ap;
int i=0;
IVEC **par;
va_start(ap, new_dim);
while (par = va_arg(ap,IVEC **)) { /* NULL ends the list*/
*par = iv_resize(*par,new_dim);
i++;
}
va_end(ap);
return i;
}
int m_resize_vars(int m,int n,...)
{
va_list ap;
int i=0;
MAT **par;
va_start(ap, n);
while (par = va_arg(ap,MAT **)) { /* NULL ends the list*/
*par = m_resize(*par,m,n);
i++;
}
va_end(ap);
return i;
}
int px_resize_vars(int new_dim,...)
{
va_list ap;
int i=0;
PERM **par;
va_start(ap, new_dim);
while (par = va_arg(ap,PERM **)) { /* NULL ends the list*/
*par = px_resize(*par,new_dim);
i++;
}
va_end(ap);
return i;
}
/* To deallocate memory for many arguments.
The function should be called:
v_free_vars(&x,&y,&z,...,NULL);
where
VEC *x, *y, *z,...;
The last argument should be NULL !
There must be at least one not NULL argument.
returned value is equal to the number of allocated variables.
Returned value of x,y,z,.. is VNULL.
Other *_free_list() functions are similar.
*/
int v_free_vars(VEC **pv,...)
{
va_list ap;
int i=1;
VEC **par;
v_free(*pv);
*pv = VNULL;
va_start(ap, pv);
while (par = va_arg(ap,VEC **)) { /* NULL ends the list*/
v_free(*par);
*par = VNULL;
i++;
}
va_end(ap);
return i;
}
int iv_free_vars(IVEC **ipv,...)
{
va_list ap;
int i=1;
IVEC **par;
iv_free(*ipv);
*ipv = IVNULL;
va_start(ap, ipv);
while (par = va_arg(ap,IVEC **)) { /* NULL ends the list*/
iv_free(*par);
*par = IVNULL;
i++;
}
va_end(ap);
return i;
}
int px_free_vars(PERM **vpx,...)
{
va_list ap;
int i=1;
PERM **par;
px_free(*vpx);
*vpx = PNULL;
va_start(ap, vpx);
while (par = va_arg(ap,PERM **)) { /* NULL ends the list*/
px_free(*par);
*par = PNULL;
i++;
}
va_end(ap);
return i;
}
int m_free_vars(MAT **va,...)
{
va_list ap;
int i=1;
MAT **par;
m_free(*va);
*va = MNULL;
va_start(ap, va);
while (par = va_arg(ap,MAT **)) { /* NULL ends the list*/
m_free(*par);
*par = MNULL;
i++;
}
va_end(ap);
return i;
}
#elif VARARGS
/* old varargs is used */
/* To allocate memory to many arguments.
The function should be called:
v_get_vars(dim,&x,&y,&z,...,VNULL);
where
int dim;
VEC *x, *y, *z,...;
The last argument should be VNULL !
dim is the length of vectors x,y,z,...
*/
int v_get_vars(va_alist) va_dcl
{
va_list ap;
int dim,i=0;
VEC **par;
va_start(ap);
dim = va_arg(ap,int);
while (par = va_arg(ap,VEC **)) { /* NULL ends the list*/
*par = v_get(dim);
i++;
}
va_end(ap);
return i;
}
int iv_get_vars(va_alist) va_dcl
{
va_list ap;
int i=0, dim;
IVEC **par;
va_start(ap);
dim = va_arg(ap,int);
while (par = va_arg(ap,IVEC **)) { /* NULL ends the list*/
*par = iv_get(dim);
i++;
}
va_end(ap);
return i;
}
int m_get_vars(va_alist) va_dcl
{
va_list ap;
int i=0, n, m;
MAT **par;
va_start(ap);
m = va_arg(ap,int);
n = va_arg(ap,int);
while (par = va_arg(ap,MAT **)) { /* NULL ends the list*/
*par = m_get(m,n);
i++;
}
va_end(ap);
return i;
}
int px_get_vars(va_alist) va_dcl
{
va_list ap;
int i=0, dim;
PERM **par;
va_start(ap);
dim = va_arg(ap,int);
while (par = va_arg(ap,PERM **)) { /* NULL ends the list*/
*par = px_get(dim);
i++;
}
va_end(ap);
return i;
}
/* To resize memory for many arguments.
The function should be called:
v_resize_vars(new_dim,&x,&y,&z,...,NULL);
where
int new_dim;
VEC *x, *y, *z,...;
The last argument should be NULL !
rdim is the resized length of vectors x,y,z,...
returned value is equal to the number of allocated variables.
If one of x,y,z,.. arguments is NULL then memory is allocated to this
argument.
Other *_resize_list() functions are similar.
*/
int v_resize_vars(va_alist) va_dcl
{
va_list ap;
int i=0, new_dim;
VEC **par;
va_start(ap);
new_dim = va_arg(ap,int);
while (par = va_arg(ap,VEC **)) { /* NULL ends the list*/
*par = v_resize(*par,new_dim);
i++;
}
va_end(ap);
return i;
}
int iv_resize_vars(va_alist) va_dcl
{
va_list ap;
int i=0, new_dim;
IVEC **par;
va_start(ap);
new_dim = va_arg(ap,int);
while (par = va_arg(ap,IVEC **)) { /* NULL ends the list*/
*par = iv_resize(*par,new_dim);
i++;
}
va_end(ap);
return i;
}
int m_resize_vars(va_alist) va_dcl
{
va_list ap;
int i=0, m, n;
MAT **par;
va_start(ap);
m = va_arg(ap,int);
n = va_arg(ap,int);
while (par = va_arg(ap,MAT **)) { /* NULL ends the list*/
*par = m_resize(*par,m,n);
i++;
}
va_end(ap);
return i;
}
int px_resize_vars(va_alist) va_dcl
{
va_list ap;
int i=0, new_dim;
PERM **par;
va_start(ap);
new_dim = va_arg(ap,int);
while (par = va_arg(ap,PERM **)) { /* NULL ends the list*/
*par = px_resize(*par,new_dim);
i++;
}
va_end(ap);
return i;
}
/* To deallocate memory for many arguments.
The function should be called:
v_free_vars(&x,&y,&z,...,NULL);
where
VEC *x, *y, *z,...;
The last argument should be NULL !
returned value is equal to the number of allocated variables.
Returned value of x,y,z,.. is VNULL.
Other *_free_list() functions are similar.
*/
int v_free_vars(va_alist) va_dcl
{
va_list ap;
int i=0;
VEC **par;
va_start(ap);
while (par = va_arg(ap,VEC **)) { /* NULL ends the list*/
v_free(*par);
*par = VNULL;
i++;
}
va_end(ap);
return i;
}
int iv_free_vars(va_alist) va_dcl
{
va_list ap;
int i=0;
IVEC **par;
va_start(ap);
while (par = va_arg(ap,IVEC **)) { /* NULL ends the list*/
iv_free(*par);
*par = IVNULL;
i++;
}
va_end(ap);
return i;
}
int px_free_vars(va_alist) va_dcl
{
va_list ap;
int i=0;
PERM **par;
va_start(ap);
while (par = va_arg(ap,PERM **)) { /* NULL ends the list*/
px_free(*par);
*par = PNULL;
i++;
}
va_end(ap);
return i;
}
int m_free_vars(va_alist) va_dcl
{
va_list ap;
int i=0;
MAT **par;
va_start(ap);
while (par = va_arg(ap,MAT **)) { /* NULL ends the list*/
m_free(*par);
*par = MNULL;
i++;
}
va_end(ap);
return i;
}
#endif /* VARARGS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -