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.
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.
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
come li hai usati??occio che se gli passi un vettore,lui ti restituisce la dimensione del puntatore,non dell'array..
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));
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..
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
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()..
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.
-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)
Usare malloc/free può essere rischioso. In questa pagina il problema viene spiegato abbastanza bene (IMHO):
si,per sicurezza conviene usare le malloc solo nel setup..o forse l'ultimo toolchain risolve in parte il problema..