[MontelLUG] Acrobazie puntatori in C

Andrea Della Regina manichen a gmail.com
Gio 7 Lug 2016 17:25:41 CEST


Ciao Samuele,

ti consiglio di debuggare usando un debugger (gdb ad esempio), se nella tua
piattaforma non è disponibile è meglio che prima ti adatti il programma per
compilare ed eseguire sul tuo PC.

Ciò detto, direi che quest'istruzioni va bene:
BufferDati = &BufferLog[20];

Ma forse è più leggibile e facile da manutenere:
BufferDati = BufferLog+ 20;

Infine, l'istruzione incriminata:
printf("Buffer: %30.30s\n", BufferDati);

Quello che fa è formattare la stringa null-terminated che inizia dove punta
BufferDati:
- identandola a destra;
- paddandola di spazi;
- incolonnandola in uno spazio di come minimo di 30 caratteri;
- troncandola a 30 se la stringa è più lunga di 30 caratteri.

Non mi è ben chiaro cosa volevi verificare, ma se hai dubbi sulla stringa
di formattazione del comando printf, è meglio che prima lo provi con
l'istruzione da shell "printf":
printf "Buffer: %30.30s\n" "1;T"

In sostanza i 27 spazi che vedi in più sono causati dal comando printf e
non sono contenuti in BufferLog.

Ciao,
Andrea


Il giorno 7 luglio 2016 17:05, Samuele via montellug <montellug a montellug.it
> ha scritto:

> Per risparmiare un po' di ram su un programma che gira su un micro, ho
> deciso di fare una acrobazia.
>
> Leggo i dati da un socket, poi devo sparare la stessa cosa su un altro,
> con l'aggiunta ad inizio pacchetto di data e ora.
> Quindi pensavo di usare un'unica variabile, con un po' di spazio
> all'inizio per aggiungere in un secondo momento la data ora.
>
> Quindi dichiaro:
>
> char BufferLog[276];
> char *BufferDati;
>
> //Dico che BufferDati, punta 20 byte dopo l'inizio di BufferLog (almeno
> credo).
>
> BufferDati = &BufferLog[20];
> ByteRicevuti = SocketDati.receiveFrom(Client, BufferDati, ByteDaRicevere);
> printf("Buffer: %30.30s\n", BufferDati);
> ScritturaLogRete(BufferLog, ByteRicevuti + 20);
>
> void ScritturaLogRete(char *Dati, int ByteDaTrasmettere)
> {
>   time_t Secondi = time(NULL);
>   strftime(Dati, 20, "%Y%m%d%H%M%S000;A;", localtime(&Secondi));
>
>   printf("BufferLog: %30.30s\n", Dati);
>   SocketLog.sendTo(Client, Dati, ByteDaTrasmettere);
> }
>
> In esecuzione ottengo:
>
> Buffer:                            1;T
> BufferLog:        20160404131824000;A;1;T
>
> Buffer ha 20 spazi all'inizio. Perché?!?!
> La data ora sbagliata è dovuto all'orologio del micro non regolato.
>
>
> _______________________________________________
> montellug mailing list
> montellug a montellug.it
> http://mail.montellug.it/mailman/listinfo/montellug
>



-- 
Andrea Della Regina - manichen a gmail.com
"Fonder des bibliothèques, c'était encore construire des greniers publics,
amasser des réserves contre un hiver de l'esprit, qu'à certains signes,
malgré moi, je vois venir." M. Yourcenar, Mémoires d'Hadrien
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://mail.montellug.it/pipermail/montellug/attachments/20160707/8e29bd5b/attachment.html>


Maggiori informazioni sulla lista montellug