[TiLUG] problemi con gcc 4.0.0.1

Nanomad condellog@gmail.com
Gio 10 Maggio 2007 21:54:36 CEST


On 5/10/07, __vroby__@libero.it <vroby.mail@gmail.com> wrote:

Premesso che non so nulla di stranezze di gcc4 con memset (a parte
qualche performance regression perche' perdi l'alliniamento in
memoria)

Prendo per dato di fatto che tutte le lunghezze delle stringhe siano
esatte. Dimmi se c'e' qualcosa che non ti torna dalla mia analisi del
codice
[CUT]
>    strncpy(dispstring,provstring+pdisp,displen);
Qui copia displen caratteri a partire dal provstring[pdisp] su dispstring

>    memset(dispstring+displen,0,1);
Qui mette a zero dispstring[displen]. sarebbe meglio fare un casting
esplicito: (char *) dispstring+displen visto che il prototipo ha un
void *

>memcpy(provstring+p,provstring+p+1,strlen(provstring)-p);
copia strlen(provstring)-p bytes da provstring[p+1] a provstring[p]
Praticamente shifti tutto di un carattere indietro a partire da provstring[p]
Ancora una volta, ti consiglio dei casting espliciti a causa dei void*
e del size_t
memcpy((char *) provstring+p,(char *) provstring+p+1,(size_t)
strlen(provstring)-p);

> memcpy(provstring+p-1,provstring+p,strlen(provstring)-p+1);
A parte i casting, la funzione copia strlen(provstring)-p+1 caratteri
da provstring[p] a provstring[p-1]. Stavolta shifti tutto di un
carattere verso avanti a partire da provstring[p]...


> memset(&provstring+p,(char)n,1);//??
Commento esplicativo
Perche' mai fai cio'??? provstring+1 gia' e' una stringa (aka
puntatore) che te ne frega del suo indirizzo (di quello del
puntatore)??

> memset(provstring+p+1,0,1);//???
E due ;)
Stai mettendo a zero provstring[p+1]

> strncpy(dispstring,provstring+pdisp,displen);
Casting?

> memset(dispstring+displen,0,1);
Stai mettendo a zero dispstring[displen]

A parte i casting (usali, anche se sono noiosi), l'unica incoerenza
che mi sembra di aver trovato l'ho segnalata
A posto dei memset io avrei usato un accesso diretto del tipo
dispstring[displen]=0 al posto di memset(dispstring+displen,0,1).
Bisogna verificare quale delle due soluzioni sia piu' efficente.
-- 
Official Ubuntu GNU/Linux Translator
Currently Running:
ZenWalk Linux (Slackware) on Desktop PC (P4 1.4Ghz)
Ubuntu "Feisty" on Laptop (Centrino 2Ghz)


Maggiori informazioni sulla lista TiLUG