Pages: [1]   Go Down
Author Topic: Comandi sizeof e strlen  (Read 989 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 68
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

provando solo a compilare ho scritto in uno sketch vuoto (solo con setup e loop) queste due righe
Code:
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
« Last Edit: September 25, 2012, 10:56:22 am by ale92 » Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 1
Posts: 68
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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));
Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 68
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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()..
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 68
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

-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)
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: