Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« on: September 25, 2012, 09:57:39 am » |
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
Jr. Member
Karma: 2
Posts: 98
|
 |
« Reply #1 on: September 25, 2012, 10:54:17 am » |
provando solo a compilare ho scritto in uno sketch vuoto (solo con setup e loop) queste due righe 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
Sr. Member
Karma: 6
Posts: 462
|
 |
« Reply #2 on: September 25, 2012, 11:05:45 am » |
come li hai usati??occio che se gli passi un vettore,lui ti restituisce la dimensione del puntatore,non dell'array..
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #3 on: September 25, 2012, 12:07:11 pm » |
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
Sr. Member
Karma: 6
Posts: 462
|
 |
« Reply #4 on: September 25, 2012, 03:10:07 pm » |
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
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #5 on: September 26, 2012, 02:17:59 am » |
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
Sr. Member
Karma: 6
Posts: 462
|
 |
« Reply #6 on: September 26, 2012, 03:05:30 am » |
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
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #7 on: September 26, 2012, 03:43:28 am » |
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
Sr. Member
Karma: 6
Posts: 462
|
 |
« Reply #8 on: September 26, 2012, 05:35:10 am » |
-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
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #9 on: September 26, 2012, 07:55:28 am » |
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
Sr. Member
Karma: 6
Posts: 462
|
 |
« Reply #10 on: September 26, 2012, 09:50:02 am » |
si,per sicurezza conviene usare le malloc solo nel setup..o forse l'ultimo toolchain risolve in parte il problema..
|
|
|
|
|
Logged
|
|
|
|
|
|