"jacob navia" <
ja...@spamsink.net> ha scritto nel messaggio
news:jp53tp$qk4$1...@speranza.aioe.org...
> When I presented an example of the interface here (thread CCL vs STL, a
> comparison), many posters complained about the syntax:
>
> int main(void)
> {
> List *L;
> int data;
>
> L = iList.Create(sizeof(int));
>
> data = 0;
> iList.Add(L,&data);
> iList.PushFront(L,&data);
> data = 2;
> iList.InsertAt(L,1,&data);
> // ...
> }
>
> It was said that passing a void pointer couldn't be checked by
> the compiler (what is trure of course) and that the whole wasn't
> very easy to use (maybe).
i add alt.lang.asm because 90% function are in x86 asm
i not agree type safety too
i think 1 runtime check is better than 1000 type check compile time
than possible i condider equivalent u32, u32* and void* and u8* and i8*...
the place of start is the examle of C++ stl list
found in book
"C++ Tecniche avanzate di programmazione"
autori: H.M. Deitel, P.J. Deitel pag 370
first i wrote the assembly function than the remain C ones
it is a double concatecated list, useful for stack queue too
all list2 function return -1 for error and set the carry flag too
/* Test per Liste e array --------*/
/*
#define uns unsigned
#define u32 unsigned
#define u64 unsigned __int64
#define i32 int
#define u16 unsigned short
#define u8 unsigned char
#define i8 char
#define i16 short
#define long_long __int64
#define sdC __stdcall
#define ooo cout
#define S sizeof
#define MM Malloc_m
#define FF Free_m
#define F for
#define R return
#define W while
#define G goto
*/
i32 __stdcall pelm(u32 elm){R P("0x%x(%u) ", elm, elm)<=0 ? -1 : 0; }
i32 List2Print(u32* list, u8* testo)
{u32 r=0, cr=0;
if(list==0) {vai: P("[ERRORE LISTA]"); R -1; }
r=ListNelem(list); if(r==-1) G vai;
if(testo){if(P("%s",testo)<=0) R -1;}
if(r==0) {R P("[ ]")<=0 ? -1: 0;}
if(P("[ ")<=0) R -1;
r=List2Applica1(list, pelm);
if(P("]" )<=0) R -1;
R r?-1:0;
}
i32 __stdcall pdouble(u32 elm)
{u32 cr=0;
GetSizeFast((void*) elm); cr+=cf(); // controlla che venga da malloc
if(cr){P("Err"); R -1;}
R P("%.0f ", *(double*)elm)<=0 ? -1 : 0;
}
i32 List2PrintD(u32* list, u8* msg)
{u32 r=0, cr=0;
if(list==0) {vai: P("[ERRORE LISTA]"); R -1; }
r=ListNelem(list); if(r==-1) G vai;
if(msg)
{if( P("%s", msg)<=0) R -1;}
if(r==0) {R P("[ ]")<=0 ? -1: 0;}
if(P("[ ")<=0) R -1;
r=List2Applica1(list, pdouble); cr+=(r!=0);
if(P("]" )<=0) R -1;
if(cr) G vai;
R r;
}
u8* DaiMemDouble(double a)
{double *r;
r=(double*)MM(S *r); if(r==0) R 0;
*r=a;
R (u8*)r;
}
u32* List2PushAT(u32* lista, u8* a)
{if(a==0) R (u32*) -1; R List2PushT(lista, (u32)a);}
u32* List2PushAH(u32* lista, u8* a)
{if(a==0) R (u32*) -1; R List2PushH(lista, (u32)a);}
i32 cmpu32(u32 a, u32 b)
{ if(a> b) R 1;
else if(a==b) R 0;
else R -1;
}
i32 cmpadouble(u32 aa, u32 bb)
{double *a, *b;
a=(double*)(aa); b=(double*)(bb);
if(a==0||b==0) R -3;
// P("%.1f<>%.1f ", *a, *b);
if(*a> *b) R 1;
else if(*a==*b) R 0;
else R -1;
}
i32 __stdcall cmp4 (u32 elm){i32 r=elm; r-=4; R r; }
i32 __stdcall cmpd4(u32 elm)
{double *r;
r=(double*)elm;
if( r==0) R -3;
if(*r==4.0) R 0;
R 1;
}
/*
Esempio parallelo a quello che usa le C++ STL
del libro: "C++ Tecniche avanzate di programmazione"
autori: H.M. Deitel, P.J. Deitel pag 370
*/
// funzione test per il tipo base u32 per liste
i32 listeProvaLibro(void)
{u32 lista[2]={0}, lista1[2]={0}, cr, r,*pr;
u32 arrayu32[10]={2,6,4,8, 2}, var, *pr1;
cr=0;
// inserisce u32 in lista
r=(u32) List2PushH(lista, 1); cr+=(r==-1);
r=(u32) List2PushH(lista, 2); cr+=(r==-1);
r=(u32) List2PushT(lista, 4); cr+=(r==-1);
r=(u32) List2PushT(lista, 3); cr+=(r==-1);
r=List2Print(lista,"lista di u32: lista="); cr+=(r==-1); P("\n");
if(cr){P("Errore"); ex: List2Free(lista); R -1;}
// ordina la lista
r=List2Sortu32(lista);cr+=(r==-1);
r=List2Print(lista,"dopo ordinamento lista=");
cr+=(r==-1); P("\n");
if(cr){P("Errore1"); G ex;}
// inserisce gli elementi dell'array arrayu32[]
pr=ListHead(lista1) ;cr+=((u32)pr==-1);
r=List2InsArrDopo(lista1,pr,arrayu32,4);cr+=(r==-1);
r=List2Print(lista1,"dopo ins array lista1=");
cr+=(r==-1);P("\n");
if(cr){P("Errore2"); ex1: List2Free(lista1); G ex;}
// rimuove gli elementi di "lista1"
// e li inserisce in coda ad "lista"
pr=ListTail(lista) ; cr+=((u32)pr==-1);
r=List2SpostaLista(lista, pr, lista1); cr+=(r==-1);
r=List2Print(lista, "lista+=lista1 lista=" );cr+=(r==-1);
r=List2Print(lista1," lista1="); cr+=(r==-1); P("\n");
if(cr) {P("Errore3\n"); G ex1;}
//ordina i valori di lista
r=List2Sortu32(lista); cr+=(r==-1);
r=List2Print(lista,"dopo ordine lista="); cr+=(r==-1); P("\n");
if(cr) {P("Errore4\n"); G ex1;}
// inserisce gli elementi dell'array arrayu32[] in lista1
pr=ListHead(lista1) ;cr+=((u32)pr==-1);
r=List2InsArrDopo(lista1,pr,arrayu32,4);cr+=(r==-1);
r=List2Sortu32(lista1); cr+=(r==-1);
r=List2Print(lista1,"dopo ins array lista1=");
cr+=(r==-1);P("\n");
if(cr) {P("Errore5\n"); G ex1;}
// rimuove gli elementi di "lista1"
// e li inserisce ordinati in "lista"
r=List2MergeLista(lista, lista1, cmpu32) ;cr+=(r==-1);
r=List2Print(lista, "Dopo merge lista=" );cr+=(r==-1);
r=List2Print(lista1, " lista1="); cr+=(r==-1); P("\n");
if(cr) {P("Errore6\n"); G ex1;}
// rimuove l'elemento in testa e in coda
r=List2PopH(&var, lista); cr+=(r==-1);
r=List2PopT(&var, lista); cr+=(r==-1);
r=List2Print(lista, "Dopo 2pop lista=");cr+=(r==-1); P("\n");
if(cr) {P("Errore7\n"); G ex1;}
// elimina i doppioni in lista
r=List2Unici(lista, cmpu32); cr+=(r==-1);
r=List2Print(lista, "Dopo aver eliminato gli unici lista=");
cr+=(r==-1); P("\n");
if(cr) {P("Errore8\n"); G ex1;}
// scambia le liste lista e lista1
r=List2SwapListe(lista, lista1) ; cr+=(r==-1);
r=List2Print(lista, "Dopo lo swap lista=" ); cr+=(r==-1);
r=List2Print(lista1, " lista1=" ); cr+=(r==-1); P("\n");
if(cr) {P("Errore9\n"); G ex1;}
// lista= lista1
pr =ListHead(lista1); cr+=((u32)pr ==-1);
pr1=ListTail(lista1); cr+=((u32)pr1==-1);
r=List2AssegnaNodi(lista, pr, pr1, lista1); cr+=(r==-1);
r=List2Print(lista, "Dopo l'assegnamento lista=" ); P("\n");
cr+=(r==-1);
if(cr) {P("Errore10\n"); G ex1;}
// rimuove gli elementi di lista1 e li inserisce ordinati in lista
r=List2MergeLista(lista, lista1, cmpu32) ; cr+=(r==-1);
r=List2Print(lista, "Dopo lista+=lista1 lista=" ); cr+=(r==-1);
r=List2Controlla(lista) ; cr+=(r==-1);
r=List2Print(lista1, " Lista1="); cr+=(r==-1); P("\n");
r=List2Controlla(lista1) ; cr+=(r==-1);
if(cr) {P("Errore11\n"); G ex1;}
// rimuove l'elemento 4 dal "lista"
r=List2RimuoviSe(lista, cmp4); cr+=(r==-1);
r=List2Print(lista, "Lista dopo rimuovi 4 lista=" );
cr+=(r==-1); P("\n");
if(cr) {P("Errore12\n"); G ex1;}
// inserisce gli elementi dell'array arrayu32[]
pr=ListHead(lista1) ;cr+=((u32)pr==-1);
r=List2InsArrDopo(lista1,pr,arrayu32,5);cr+=(r==-1);
r=List2Print(lista1,"dopo ins array lista1=");
cr+=(r==-1);P("\n");
if(cr) {P("Errore13\n"); G ex1;}
// cerca dopo il nodo di indirizzo var; var=0 significa inizia da head
var=0;
r=List2FindNext(lista1, &var, 2, cmpu32); cr+=(r==-1);
if(r==0) {P("Trovato nodo=0x%x, *nodo+E=%u\n", var, *(u32*)(var+8) );}
r=List2FindNext(lista1, &var, 2, cmpu32); cr+=(r==-1);
if(r==0) {P("Trovato nodo=0x%x, *nodo+E=%u\n", var, *(u32*)(var+8) );}
r=List2FindNext(lista1, &var, 2, cmpu32); cr+=(r==-1);
if(r==0) {P("Trovato nodo=0x%x, *nodo+E=%u\n", var, *(u32*)(var+8) );}
r=List2FindNext(lista1, &var, 2, cmpu32); cr+=(r==-1);
if(cr) {P("Errore14\n"); G ex1;}
r=List2Free(lista ); cr+=(r==-1); r=List2Free(lista1);cr+=cf();
P("Alla fine r=%u cr=0\n", r, cr);
R 0;
}
/*
Esempio parallelo a quello che usa le C++ STL
del libro: "C++ Tecniche avanzate di programmazione"
autori: H.M. Deitel, P.J. Deitel pag 370
*/
// funzione test per il tipo double per liste
i32 listeProvaLibroDouble(void)
{double arrayd32[10]={2.0,6.0,4.0,8.0, 2.0}, m, *pd;
u32 lista[2]={0}, lista1[2]={0}, cr, r, var, var1, *pr, *pr1;
cr=0;
// inserisce double in lista
r=(u32) List2PushAH(lista, DaiMemDouble(1.0)); cr+=(r==-1);
r=(u32) List2PushAH(lista, DaiMemDouble(2.0)); cr+=(r==-1);
r=(u32) List2PushAT(lista, DaiMemDouble(4.0)); cr+=(r==-1);
r=(u32) List2PushAT(lista, DaiMemDouble(3.0)); cr+=(r==-1);
r=List2PrintD(lista,"lista di double: lista=");
cr+=(r==-1); P("\n");
if(cr){P("Errore"); ex: List2FreeNodiDaMalloc(lista); R -1;}
// ordina la lista
r=List2Sort(lista, cmpadouble); cr+=(r==-1);
r=List2PrintD(lista,"dopo ordinamento lista=");
cr+=(r==-1); P("\n");
if(cr){P("Errore1"); G ex;}
// inserisce gli elementi dell'array arrayd32[]
pr=ListHead(lista1); cr+=((u32)pr==-1);
r =List2InsArrDopoA(lista1,pr, (u32*) arrayd32,4, S(double));
cr+=(r==-1);
r=List2PrintD(lista1,"dopo ins array lista1=");
cr+=(r==-1);P("\n");
if(cr){P("Errore2"); ex1: List2FreeNodiDaMalloc(lista1); G ex;}
// rimuove gli elementi di "lista1"
// e li inserisce in coda ad "lista"
pr=ListTail(lista) ; cr+=((u32)pr==-1);
r =List2SpostaLista(lista, pr, lista1); cr+=(r==-1);
r =List2PrintD(lista, "lista+=lista1 lista=" );cr+=(r==-1);
r =List2PrintD(lista1," lista1="); cr+=(r==-1); P("\n");
if(cr) {P("Errore3\n"); G ex1;}
//ordina i valori di lista
r= List2Sort(lista, cmpadouble); cr+=(r==-1);
r=List2PrintD(lista,"dopo ordine lista="); cr+=(r==-1); P("\n");
if(cr) {P("Errore4\n"); G ex1;}
// inserisce gli elementi dell'array arrayd32[] in lista1
pr=ListHead(lista1); cr+=((u32)pr==-1);
r =List2InsArrDopoA(lista1,pr,(u32*)arrayd32,4, S(double) );
cr+=(r==-1);
r =List2Sort(lista1, cmpadouble); cr+=(r==-1);
r =List2PrintD(lista1,"dopo ins arr lista1=");
cr+=(r==-1);P("\n");
if(cr) {P("Errore5\n"); G ex1;}
// rimuove gli elementi di "lista1"
// e li inserisce ordinati in "lista"
r=List2MergeLista(lista, lista1, cmpadouble);cr+=(r==-1);
r=List2PrintD(lista, "Dopo merge lista=" ); cr+=(r==-1);
r=List2PrintD(lista1, " lista1="); cr+=(r==-1); P("\n");
if(cr) {P("Errore6\n"); G ex1;}
// rimuove l'elemento in testa e in coda
r=List2PopH((u32*) &pd, lista); cr+=(r==-1); FF(pd);
r=List2PopT((u32*) &pd, lista); cr+=(r==-1); FF(pd);
r=List2PrintD(lista, "Dopo 2pop lista=");cr+=(r==-1); P("\n");
if(cr) {P("Errore7\n"); G ex1;}
// elimina i doppioni in lista
r=List2UniciA(lista, cmpadouble); cr+=(r==-1);
r=List2PrintD(lista, "Dopo aver eliminato gli unici lista=");
cr+=(r==-1); P("\n");
if(cr) {P("Errore8\n"); G ex1;}
// scambia le liste lista e lista1
r=List2SwapListe(lista, lista1) ; cr+=(r==-1);
r=List2PrintD(lista, "Dopo lo swap lista=" ); cr+=(r==-1);
r=List2PrintD(lista1, " lista1=" ); cr+=(r==-1); P("\n");
if(cr) {P("Errore9\n"); G ex1;}
// lista= lista1
pr =ListHead(lista1); cr+=((u32)pr ==-1);
pr1=ListTail(lista1); cr+=((u32)pr1==-1);
r=List2AssegnaNodiA(lista, pr, pr1, lista1, S(double));
cr+=(r==-1);
r=List2PrintD(lista, "Dopo l'assegnamento lista=" );
cr+=(r==-1);
r=List2PrintD(lista, " lista1=" ); P("\n");
cr+=(r==-1);
if(cr) {P("Errore10\n"); G ex1;}
// rimuove gli elementi di lista1 e li inserisce ordinati in lista
r=List2MergeLista(lista, lista1, cmpadouble); cr+=(r==-1);
r=List2PrintD(lista, "Merge lista1 in lista; lista=" );
cr+=(r==-1);
r=List2Controlla(lista); cr+=(r==-1);
r=List2PrintD(lista1, " Lista1=");cr+=(r==-1); P("\n");
r=List2Controlla(lista1); cr+=(r==-1);
if(cr) {P("Errore11\n"); G ex1;}
// rimuove l'elemento 4.0 dal "lista"
r=List2RimuoviSeA(lista, cmpd4); cr+=(r==-1);
r=List2PrintD(lista, "Lista dopo rimuovi 4.0 lista=" );
cr+=(r==-1); P("\n");
if(cr) {P("Errore12\n"); G ex1;}
// inserisce gli elementi dell'array arrayd32[]
pr=ListHead(lista1) ;cr+=((u32)pr==-1);
r =List2InsArrDopoA(lista1,pr, (u32*) arrayd32,5, S(double));
cr+=(r==-1);
r=List2PrintD(lista1,"dopo ins array lista1=");
cr+=(r==-1);P("\n");
if(cr) {P("Errore13\n"); G ex1;}
// cerca dopo il nodo di indirizzo var; var=0 significa inizia da head
m=2.0;
r=List2FindNext(lista1, &var, (u32) &m, cmpadouble); cr+=(r==-1);
if(r==0) {var1=*(u32*)(var+8);
P("Trovato nodo=0x%x, *nodo+E=%.1f\n", var, *(double*)var1);
}
r=List2FindNext(lista1, &var, (u32) &m, cmpadouble); cr+=(r==-1);
if(r==0){var1=*(u32*)(var+8);
P("Trovato nodo=0x%x, *nodo+E=%.1f\n", var, *(double*)var1);
}
r=List2FindNext(lista1, &var, (u32) &m, cmpadouble); cr+=(r==-1);
if(r==0){var1=*(u32*)(var+8);
P("Trovato nodo=0x%x, *nodo+E=%.1f\n", var, *(double*)var1);
}
r=List2FindNext(lista1, &var, (u32) &m, cmpadouble); cr+=(r==-1);
if(r==0){var1=*(u32*)(var+8);
P("Trovato nodo=0x%x, *nodo+E=%.1f\n", var, *(double*)var1);
}
if(cr) {P("Errore14\n"); G ex1;}
r=List2FreeNodiDaMalloc(lista) ;cr+=(r==-1);
r=List2FreeNodiDaMalloc(lista1);cr+=(r==-1);
P("Alla fine r=%u cr=%u\n", r, cr);
R 0;
}
lista di u32: lista=[ 0x2(2) 0x1(1) 0x4(4) 0x3(3) ]
dopo ordinamento lista=[ 0x1(1) 0x2(2) 0x3(3) 0x4(4) ]
dopo ins array lista1=[ 0x2(2) 0x6(6) 0x4(4) 0x8(8) ]
lista+=lista1 lista=[ 0x1(1) 0x2(2) 0x3(3) 0x4(4) 0x2(2) 0x6(6) 0x4(4) 0x8(8) ]
l
ista1=[ ]
dopo ordine lista=[ 0x1(1) 0x2(2) 0x2(2) 0x3(3) 0x4(4) 0x4(4) 0x6(6) 0x8(8) ]
dopo ins array lista1=[ 0x2(2) 0x4(4) 0x6(6) 0x8(8) ]
Dopo merge lista=[ 0x1(1) 0x2(2) 0x2(2) 0x2(2) 0x3(3) 0x4(4) 0x4(4) 0x4(4)
0x6(6)
0x6(6) 0x8(8) 0x8(8) ] lista1=[ ]
Dopo 2pop lista=[ 0x2(2) 0x2(2) 0x2(2) 0x3(3) 0x4(4) 0x4(4) 0x4(4) 0x6(6) 0x6(6)
0
x8(8) ]
Dopo aver eliminato gli unici lista=[ 0x2(2) 0x3(3) 0x4(4) 0x6(6) 0x8(8) ]
Dopo lo swap lista=[ ] lista1=[ 0x2(2) 0x3(3) 0x4(4) 0x6(6) 0x8(8) ]
Dopo l'assegnamento lista=[ 0x2(2) 0x3(3) 0x4(4) 0x6(6) 0x8(8) ]
Dopo lista+=lista1 lista=[ 0x2(2) 0x2(2) 0x3(3) 0x3(3) 0x4(4) 0x4(4) 0x6(6)
0x6(6)
0x8(8) 0x8(8) ] Lista1=[ ]
Lista dopo rimuovi 4 lista=[ 0x2(2) 0x2(2) 0x3(3) 0x3(3) 0x6(6) 0x6(6) 0x8(8)
0x8(
8) ]
dopo ins array lista1=[ 0x2(2) 0x6(6) 0x4(4) 0x8(8) 0x2(2) ]
Trovato nodo=0x32E508, *nodo+E=2
Trovato nodo=0x32E3E8, *nodo+E=2
Alla fine r=0 cr=0
lista di double: lista=[ 2 1 4 3 ]
dopo ordinamento lista=[ 1 2 3 4 ]
dopo ins array lista1=[ 2 6 4 8 ]
lista+=lista1 lista=[ 1 2 3 4 2 6 4 8 ] lista1=[ ]
dopo ordine lista=[ 1 2 2 3 4 4 6 8 ]
dopo ins arr lista1=[ 2 4 6 8 ]
Dopo merge lista=[ 1 2 2 2 3 4 4 4 6 6 8 8 ] lista1=[ ]
Dopo 2pop lista=[ 2 2 2 3 4 4 4 6 6 8 ]
Dopo aver eliminato gli unici lista=[ 2 3 4 6 8 ]
Dopo lo swap lista=[ ] lista1=[ 2 3 4 6 8 ]
Dopo l'assegnamento lista=[ 2 3 4 6 8 ] lista1=[ 2 3 4 6 8 ]
Merge lista1 in lista; lista=[ 2 2 3 3 4 4 6 6 8 8 ] Lista1=[ ]
Lista dopo rimuovi 4.0 lista=[ 2 2 3 3 6 6 8 8 ]
dopo ins array lista1=[ 2 6 4 8 2 ]
Trovato nodo=0x32E408, *nodo+E=2.0
Trovato nodo=0x32DFB8, *nodo+E=2.0
Alla fine r=0 cr=0