io_x
6/27/2011 7:37:00 AM
"io_x" <a@b.c.invalid> ha scritto nel messaggio
news:4e076731$0$44197$4fafbaef@reader1.news.tin.it...
> when someone has "a=3"
> than is possible to have &a, but why not &3?
> where &3 means the place in the memory [address]
> where there is stored the value 3
yes i can do something that return the copy of
the costant in an address
somthing as:
// return the address of one region of mem
// that contain the costant number
#define A(a) RitornaPuntatoreAmem(sizeof a, a)
but i have the dubit that:
pc=(u8*)&(va_arg(ap, u8*));
is right...
but how to write such function, that get one costant
and return one pointer to space of mem that contain
that costant...
if the costant is a number double as 1.1, int -1,
or unsigned int 99
as in A(99) or A(1.1) or A(-1)
#include <stdarg.h>
#include <limits.h>
// CHAR_BIT
#include <stdlib.h>
#include <stdio.h>
// macro for types
#define u8 unsigned char
#if ULONG_MAX == 0xFFFFFFFF
#define u32 unsigned long
#elif UINT_MAX == 0xFFFFFFFF
#define u32 unsigned int
#elif USHRT_MAX == 0xFFFFFFFF
#define u32 unsigned short
#else
#error "Non posso compilare con questo sistema"
#endif
#define uns unsigned
// macro for function
#define P printf
// macro for keyWords
#define G goto
#define R return
#define W while
#define F for
#define T template
#define TN typename
#define S sizeof
typedef struct ArrObj_{
u32 top;
u32 sz;
u32 ObjSz;
u8* arr;
}ArrObj;
u32 IniArrObj(ArrObj** v, u32 osz)
{u32 t;
ArrObj *vv;
u8 *arr;
if(v==0||osz==0||osz>0xFFFFFF)
R -1;
vv = malloc(S(ArrObj));
if(vv==0) R -1;
t=osz; t*=10; // spazio per 10 obj
if(t > 0xFFFFFF)
{err: free(vv); *v=0; R -1;}
arr=malloc(t); if(t==0) G err;
*v=vv; vv->top=-1; vv->sz=10;
vv->ObjSz=osz; vv->arr=arr;
R 0;
}
void freeArrObj(ArrObj** v)
{u32 i;
ArrObj *vv;
if(v==0) R;
vv=*v;
if(vv==0) R;
free(vv->arr); free(vv);
*v=0;
}
u32 ApplyArrObj(ArrObj** v, u32 (*f)(u8*))
{u32 i, r, sz;
u8 *va;
ArrObj *vv;
if(v==0||*v==0) R -1;
vv=*v;
if(vv==0) {P("Array NULL\n"); R 0;}
if(vv->top==(u32)-1)
{P("Array void\n"); R 0;}
va=vv->arr; sz=vv->ObjSz;
if(vv->top>0xFFFFFF||va==0||sz==0||sz>0xFFFFF)
{P("Array error\n"); R 0;}
F(i=vv->top, r=0; i!=0; --i)
r|=f(va+i*sz);
r|=f(va);
R r;
}
ArrObj** push(ArrObj** v, u8* elm)
{u8 *va, *r;
ArrObj *vv;
u32 i, j, elmsz;
if(v==0||*v==0||elm==0)
R 0;
vv=*v; elmsz=vv->ObjSz;
if(vv->sz>0xFFFFFF||elmsz>0xFFFFF)
R 0;
if(vv->sz==0||vv->top==(vv->sz-1))
{if(vv->sz==0) vv->arr=0;
i=2*vv->sz+4;
j=i*elmsz;
if(i>=j||j>0xFFFFFF) R 0;
va=realloc(vv->arr, j);
if(va==0) R 0;
vv->arr=va;
vv->sz = i;
}
++vv->top;
r=(vv->arr)+(vv->top)*elmsz;
F(i=0; i<elmsz; ++i)
r[i]=elm[i];
R v;
}
u32 Write(ArrObj** v, u32 index, u8* elm)
{u8 *va, *r;
ArrObj *vv;
u32 i, j, elmsz;
if(v==0||*v==0||elm==0||index>0xFFFFFF)
R -1;
vv=*v; elmsz=vv->ObjSz;
if(vv->sz>0xFFFFFF||elmsz>0xFFFFF)
R -1;
if(index> vv->top+1) R -1;
if(vv->sz==0||index==(vv->sz-1))
{if(vv->sz==0) vv->arr=0;
i=2*vv->sz+4;
j=i*elmsz;
if(i>=j||j>0xFFFFFF) R -1;
va=realloc(vv->arr, j);
if(va==0) R -1;
vv->arr=va;
vv->sz = i;
}
if(index==vv->top+1) ++vv->top;
r=(vv->arr)+index*elmsz;
F(i=0; i<elmsz; ++i)
r[i]=elm[i];
R 0;
}
/*
Se elm!=0 fa il pop dell'elemento
in ogni caso ritorna un puntatore all'elemento popped
0 significa errore
*/
ArrObj** pop(u8* elm, ArrObj** v)
{u8 *va, *r;
ArrObj *vv;
u32 i, elmsz;
if(v==0||*v==0) R 0;
vv=*v; elmsz=vv->ObjSz;
if(vv->sz>0xFFFFFF||vv->top==(u32)-1||
elmsz==0||elmsz>0xFFFFF)
R 0;
if(elm!=0)
{r=(vv->arr)+(vv->top)*elmsz;
F(i=0; i<elmsz; ++i)
{elm[i]=r[i]; r[i]=0;}
}
--vv->top;
R v;
}
// 0 means error
ArrObj** top(u8* elm, ArrObj** v)
{u8 *r;
ArrObj *vv;
u32 i, elmsz;
if(v==0||*v==0||elm==0)
R 0;
vv=*v; elmsz=vv->ObjSz;
if( vv->sz > 0xFFFFFF
||vv->top==(u32)-1
||elmsz==0 || elmsz>0xFFFFF )
R 0;
r=(vv->arr)+(vv->top)*elmsz;
F(i=0; i<elmsz; ++i)
elm[i]=r[i];
R v;
}
u32 get(u8* ele, ArrObj** v, u32 index)
{u8 *r;
ArrObj *vv;
u32 i, elmsz;
if(ele==0||index>0xFFFFFF||v==0||*v==0)
R -1;
vv=*v; elmsz=vv->ObjSz;
if(vv->sz>0xFFFFFF ||vv->top==(u32)-1||index>vv->top||
elmsz==0||elmsz>0xFFFFF )
R -1;
r=(vv->arr)+(vv->top)*elmsz;
F(i=0; i<elmsz; ++i)
ele[i]=r[i];
R 0;
}
u32 insert(ArrObj** v, u32 index, u8* ele)
{u8 *r, *k, *h;
ArrObj *vv;
u32 i,j,elmsz;
if(ele==0||index>0xFFFFFF||v==0||*v==0)
R -1;
vv=*v; elmsz=vv->ObjSz;
if(vv->sz>0xFFFFFF||vv->top==(u32)-1||index>(vv->top)+1||
elmsz==0||elmsz>0xFFFFF )
R -1;
if(vv->sz==0||index>=(vv->sz-1))
{if(vv->sz==0) vv->arr=0;
i=2*vv->sz+4;
j=i*elmsz;
if(i>=j||j>0xFFFFFF) R -1;
r=realloc(vv->arr, j);
if(r ==0) R -1;
vv->arr=r;
vv->sz =i;
}
// spostare gli elementi sopra l'indice di 1
h=(vv->arr)+ index*elmsz;
r=(vv->arr)+(vv->top+1)*elmsz;
k=(vv->arr)+(vv->top )*elmsz;
F(; k>=h;--r,--k)
*r=*k;
F(i=0, ++k; i<elmsz; ++i)
k[i]=ele[i];
++vv->top;
R 0;
}
u32 printu(u8* a)
{u32 v, r;
v=*(u32*)a;
r=P("%u ", (uns) v);
if((int)r<=0) R -1;
R 0;
}
u32 printd(u8* a)
{double v;
u32 r;
v=*(double*)a;
r=P("%f ", v);
if((int)r<=0) R -1;
R 0;
}
// return the address of one region of mem
// that contain the costant number
#define A(a) RitornaPuntatoreAmem(sizeof a, a)
u8* RitornaPuntatoreAmem(u32 sz, ...)
{static u8 *val=0;
va_list ap;
u8 *pc;
u32 i;
if(sz>512) R 0;
if(val==0){/* the memory for this vector of u8*
is a leak and never be free until
this program run
*/
val=malloc(1000);
if(val==0) R 0;
}
va_start(ap, sz);
pc=(u8*)&(va_arg(ap, u8*));
F(i=0; i<sz; ++i)
val[i]=pc[i];
va_end(ap);
R val;
}
int test(void)
{double a;
ArrObj *Adouble;
ArrObj *Au32;
u32 b, r;
r=IniArrObj(&Adouble, S(double));
if(r!=0) R -1;
IniArrObj(&Au32, S(u32));
if(r!=0){err:
P("Errore\n");
freeArrObj(&Adouble);
R -1;
}
if(push(&Adouble, A(1.1))==0)
{err1: freeArrObj(&Au32); G err;}
if(push(&Adouble, A(1.2))==0) G err1;
if(push(&Adouble, A(1.3))==0) G err1;
if(push(&Au32, A(1))==0) G err1;
if(push(&Au32, A(2))==0) G err1;
if(push(&Au32, A(3))==0) G err1;
P("Array di u 32: ") ;ApplyArrObj(&Au32, printu);
P("\nArray di double: ");ApplyArrObj(&Adouble, printd);
freeArrObj(&Au32);
freeArrObj(&Adouble);
R 0;
}
int main(void)
{//P("sizeof 1.1=%u\n", (uns) sizeof 1.1);
test();
R 0;
}