Go Down

Topic: Comandi sizeof e strlen (Read 1 time) previous topic - next topic

giannilucia

Salve a tutti,

qualcuno sa per caso come utilizzare i comandi sopracitati in arduino? Io ho provato ad utilizzarli e mi danno errore in compilazione

Grazie in anticipo per le risposte.

ale92

#1
Sep 25, 2012, 05:54 pm Last Edit: Sep 25, 2012, 05:56 pm by ale92 Reason: 1
provando solo a compilare ho scritto in uno sketch vuoto (solo con setup e loop) queste due righe
Code: [Select]

char Msg[30] = "ciao";                        
int lastStringLength = strlen(Msg);  


e non mi hanno dato nessun problema di compilazione

mentre qui http://arduino.cc/en/Reference/Sizeof c'è proprio la pagina ufficiale quindi penso che neanche questo da problemi

m_ri

come li hai usati??occio che se gli passi un vettore,lui ti restituisce la dimensione del puntatore,non dell'array..

giannilucia

vi posto il codice, penso che il problema non sia tanto dovuto ai due comandi quanto al fatto che con arduino nn si possano creare array dinamici.
Comunque questo è il codice vedete dove sbaglio, e grazie per il supporto.


/*variable header*/
    uint8_t var_header[] = {0x00,0x06,0x4d,0x51,0x49,0x73,0x64,0x70,0x03,0x02,0x00,KEEPALIVE/500,0x00,strlen(id)};
   
    /*fixed header: 2 bytes, big endian*/
    uint8_t fixed_header[] = {MQTTCONNECT,12+strlen(id)+2};

    char packet[sizeof(fixed_header)+sizeof(var_header)+strlen(id)];
   
    memset(packet,0,sizeof(packet));
    memcpy(packet,fixed_header,sizeof(fixed_header));
    memcpy(packet+sizeof(fixed_header),var_header,sizeof(var_header));
    memcpy(packet+sizeof(fixed_header)+sizeof(var_header),id,strlen(id));

m_ri

due cose:
-quando inizializzi un vettore con {valore1,valore2..} non sono sicuro che tu possa mettere come valore una variabile o una funzione..e poi,cos'è la variabile id?
-la dimensione del tuo vettore packet moolto probabilmente viene calcolata a run time..quindi il tuo compilatore deve permettere la decisione della dimensione dell'array statico a RUN-TIME(e non a compile time)..questa possibilità è stata introdotta da c99,ma dipende se il compilatore lo supporta..

giannilucia

Grazie per la risposta,

allora in C questa sintassi è giusta, sia per quanto riguarda l'inizializzazione del vettore che il resto. Per quanto riguarda l'array dinamico è proprio quello che hai detto tu e quindi mi sorge il dubbio che il compilatore non supporti questa funzione, si potrebbe ovviare a questo con qualcosa di alternativo?

char *id

m_ri

ho controllato e in effetti è possibile inizializzare un vettore con le {} con dentro valori non costanti..
per l'allocazione,a sto punto ti conviene usare l'allocazione dinamica e non quella statica..quindi malloc() e free()..

giannilucia

Allora il tuo consiglio mi sembra molto sensato, ho utilizzato la malloc per allocare la memoria necessaria,questa funzione mi dovrebbe sostituire la memset giusto? ora per inserire i parametri, quella lista di valori presenti nel memcpy?

char *packet=(char*) malloc(sizeof(fixed_header)+sizeof(var_header)+strlen(id)); // Alloca memoria per contenere i parametri di connessione per il server
 
   memcpy(packet,fixed_header,sizeof(fixed_header));
   memcpy(packet+sizeof(fixed_header),var_header,sizeof(var_header));
   memcpy(packet+sizeof(fixed_header)+sizeof(var_header),id,strlen(id));

ti chiedo scusa,ma mi stò approcciando adesso alla programmazione in C e tu mi sembri molto competente,grazie.

m_ri

-la malloc serve solo per allocare memoria,ma non interviene su essa..cioè se c'erano ei valori in quelle celle della RAM,rimangono tali..
-memset serve per riempire una regione di memoria(vettore,matrice..) con lo stesso valore ovunque..il valore è il byte più basso del value che gli passi(cioè il secondo parametro)..se gli passi come value un char,ok,ma se gli passi un integer(2 o 4 byte) lui tiene solo il byte più basso)

tuxduino

Usare malloc/free può essere rischioso. In questa pagina il problema viene spiegato abbastanza bene (IMHO):

http://www.nongnu.org/avr-libc/user-manual/malloc.html

m_ri

si,per sicurezza conviene usare le malloc solo nel setup..o forse l'ultimo toolchain risolve in parte il problema..

Go Up