View Full Version : [C++] strcat e gli array unsigned char...
DomusP45
13-03-2012, 16:25
Salve a tutti, vi posto una parte di codice che vorrei mi aiutaste a risolvere:
devo concatenare due array di tipo "unsigned char" in uno solo per passarlo poi alla porta com. Solo che strcat non se li prende "unsigned"....
difatti da questo codice:
int Posiziona(unsigned char p[255])
{
unsigned char par[255]="0x05B0 ";
strcat(par,p); //aggiungo header per il posizionamento, in testa ai parametri passati
//invio buffer alla porta
int inv=SendBuf(Pnum,par,254);
return inv; //mi ritorna il numero di bytes inviati
}
mi ritorna un errore e non compila, l'errore è:
invalid conversion from ‘unsigned char*’ to ‘char*’
mi dite come posso fare? Devono essere per forza unsigned gli array purtroppo.
Aiuto!:muro: :muro:
DomusP45
13-03-2012, 17:04
casting?
scusa ma che risposta è?
o mi dici come si fa oppure è inutile rispondere così...è una sezione dove si possono fare domande o no?
lo so benissimo che si dovrebbe fare il "casting" ma come?
in questo caso come lo fai? e visto che il parametro alla funzione deve essere comunque unsigned come si fa?
Se lo sapevo, mica chiedevo...help me!
scusa ma che risposta è?
o mi dici come si fa oppure è inutile rispondere così...è una sezione dove si possono fare domande o no?
lo so benissimo che si dovrebbe fare il "casting" ma come?
in questo caso come lo fai? e visto che il parametro alla funzione deve essere comunque unsigned come si fa?
Se lo sapevo, mica chiedevo...help me!
ma che modi,
semplicemente ti ho dettp di provare fare un castiing, operazione banalissima in c++
domanda--> risposta come si fà a far credere che una variabile di un tipo sia una variabile di un altro tipo? --> usa il casting
tralasciando il fatto che non capisco come mai un semplice numero devi mandarlo con uchar ma non hai provato se funziona un semplice
strcat((char*)par,(char*)p); oppure potevi provare a dichiarare due banalisismi puntatori a char e associarli ai tuoi vettori?
ovviamente non è detto che funzioni dipende dall'architettura
ma qui la gente vuole la pappa pronta, una persona che fà il lavoro al posto vostro,non basta la semplice soluzione o un idea per risolvere!
DomusP45
13-03-2012, 22:31
tralasciando il fatto che non capisco come mai un semplice numero devi mandarlo con uchar ma non hai provato se funziona un semplice
strcat((char*)par,(char*)p); oppure potevi provare a dichiarare due banalisismi puntatori a char e associarli ai tuoi vettori?
ma qui la gente vuole la pappa pronta, una persona che fà il lavoro al posto vostro,non basta la semplice soluzione o un idea per risolvere!
caro !fazz,
lungi da me cercare pappe pronte.
Sono settimane che sto sbattendo la testa su una classe di comunicazione seriale che sto creando, e questo è un problema che sto cercando di risolvere.
Il casting come l'hai descritto tu, purtroppo non va. E non è tanto banale, sai?
Deve girare su un sistema linux, purtroppo la libreria seriale che devo usare per la comunicazione ha come funzioni di input e output funzioni che accettano solo "unsigned char"...e visto che devo concatenare due vettori unsigned, avevo chiesto se qualcuno sapeva dirmi come...visto che prima di postare qua ho cercato in giro con google, ma c'è tanta confusione e cose che non centrano.
Ora, visto che ho fatto tante domande in questa sezione del forum, ma purtroppo non mi hanno saputo aiutare, avevo chiesto questa cosa specifica, proprio per ricevere magari una risposta "diretta" su come concatenarli due array di quel tipo.
La cosa dei puntatori non l'ho provata e la proverò...e ti terrò aggiornato.
Ma se qualcuno avesse qualche altra idea, fatemi sapere.
__ZERO_UNO__
14-03-2012, 00:46
Ho provato usando reinterpret_cast e funziona. Trovi la documentazione qui: http://www.cplusplus.com/doc/tutorial/typecasting/
Nasty nasty thing anyhow... hihihihi
caro !fazz,
lungi da me cercare pappe pronte.
Sono settimane che sto sbattendo la testa su una classe di comunicazione seriale che sto creando, e questo è un problema che sto cercando di risolvere.
Il casting come l'hai descritto tu, purtroppo non va. E non è tanto banale, sai?
Deve girare su un sistema linux, purtroppo la libreria seriale che devo usare per la comunicazione ha come funzioni di input e output funzioni che accettano solo "unsigned char"...e visto che devo concatenare due vettori unsigned, avevo chiesto se qualcuno sapeva dirmi come...visto che prima di postare qua ho cercato in giro con google, ma c'è tanta confusione e cose che non centrano.
Ora, visto che ho fatto tante domande in questa sezione del forum, ma purtroppo non mi hanno saputo aiutare, avevo chiesto questa cosa specifica, proprio per ricevere magari una risposta "diretta" su come concatenarli due array di quel tipo.
La cosa dei puntatori non l'ho provata e la proverò...e ti terrò aggiornato.
Ma se qualcuno avesse qualche altra idea, fatemi sapere.
sarebbe bastato dirlo nel primo post oppure come reply anche un solo "ho già provato e non funziona " sarebbe bastato :)
domanda perchè devi concatenare degli unsigned? non fai prima a gestirli come numeri
ps sotto linux mi sa che fai prima a utilizzare i file che una libreria di comunicazione seriale
DomusP45
14-03-2012, 12:08
Innanzi tutto grazie a tutti per la disponibilità.
Ho provato usando reinterpret_cast e funziona. Trovi la documentazione qui: http://www.cplusplus.com/doc/tutorial/typecasting/
Nasty nasty thing anyhow... hihihihi
Grazie mille...me lo guarderò con calma e provo.
domanda perchè devi concatenare degli unsigned? non fai prima a gestirli come numeri
ps sotto linux mi sa che fai prima a utilizzare i file che una libreria di comunicazione seriale
Questi caspita di vettori devono andare ad un pinza servoelettrica che vuole input (e da in output) esadecimali nel formato "0x01 0x05 0x4F" ecc...
La libreria in questione è un obbligo che mi ha imposto il docente per la portabilità (dice che queste librerie funzionano sia sotto windows che sotto linux, invece le funzioni di "termios" funzionano solo per linux a quel che ho capito)
Il problema più grande però l'ho scoperto questa mattina.
l'array che va inviato deve essere di questo tipo:
"ID" "Group" "D-Len" "Cmd" "Data" "CRC"
Dove:
- ID e Group sono quelli della pinza in questione
- D-Len (1byte) è una sorta di header del comando
- Cmd (1byte) è il codice del comando
- Data (4 byte) sono i parametri del comando (che l'utente di questo programma dovrà poter inserire, ecco perchè mi serve il concatenamento...)
- CRC è un codice di controllo, che è diverso a seconda di quello che mando.
Il problema è come implementare il CRC, e come concatenare insieme tutti sti pezzi in un unico array che va poi inviato alla pinza...
:cry: :cry: :cry: :cry: devo farla come "tirocinio" per laurearmi in ingegneria informatica sta roba.....anche se è della facoltà di automazione, io che sto ad informatica ho scelto di fare una cosa diversa per imparare qualcosa, invece mi hanno lasciato completamente solo davanti sta cosa a vedere come risolvere...
Posso garantirvi che gli esami di programmazione, ingegneria del software e quant'altro che ho fatto, non mi servono a niente per fare queste cose...che non ho mai fatto prima.
Innanzi tutto grazie a tutti per la disponibilità.
Grazie mille...me lo guarderò con calma e provo.
Questi caspita di vettori devono andare ad un pinza servoelettrica che vuole input (e da in output) esadecimali nel formato "0x01 0x05 0x4F" ecc...
La libreria in questione è un obbligo che mi ha imposto il docente per la portabilità (dice che queste librerie funzionano sia sotto windows che sotto linux, invece le funzioni di "termios" funzionano solo per linux a quel che ho capito)
Il problema più grande però l'ho scoperto questa mattina.
l'array che va inviato deve essere di questo tipo:
"ID" "Group" "D-Len" "Cmd" "Data" "CRC"
Dove:
- ID e Group sono quelli della pinza in questione
- D-Len (1byte) è una sorta di header del comando
- Cmd (1byte) è il codice del comando
- Data (4 byte) sono i parametri del comando (che l'utente di questo programma dovrà poter inserire, ecco perchè mi serve il concatenamento...)
- CRC è un codice di controllo, che è diverso a seconda di quello che mando.
Il problema è come implementare il CRC, e come concatenare insieme tutti sti pezzi in un unico array che va poi inviato alla pinza...
:cry: :cry: :cry: :cry: devo farla come "tirocinio" per laurearmi in ingegneria informatica sta roba.....anche se è della facoltà di automazione, io che sto ad informatica ho scelto di fare una cosa diversa per imparare qualcosa, invece mi hanno lasciato completamente solo davanti sta cosa a vedere come risolvere...
Posso garantirvi che gli esami di programmazione, ingegneria del software e quant'altro che ho fatto, non mi servono a niente per fare queste cose...che non ho mai fatto prima.
va be non pare tanto complicato da doversi fasciare la testa prima del dovuto alla fine è semplice programmazione e gestione di stringhe di testo, non è che devi crearti il PID per il controllo del braccio e le matrici di rotazione, sei quasi ingegnere informatico un pò di programmazione devi saperla, altrimenti non saresti qui quindi con calma scomponi il problema in problemi più semplici e con calma risolvili uno ad uno, stai per diventare Ingegnere, non so che idee ti sei fatto ma sei tu quello che devo trovare le soluzioni ai problemi non gli altri, perdersi su una cavolata come una gestione di stringhe non mi pare proprio il caso
implementare il crc è una cavolata immane devi solo capire che tipo di crc usa la pinza e dopo rifare il calcolo sul tuo array prima dell'invio
per concatenare i pezzi puoi usare quello che vuoi, visto che il problema è semplicissimo puoi benissimo farti una funzione dove passati tutti i parametri vai a popolare il vettore carattere per carattere, insomma ti dovrebbe bastare circa la prima metà del primo corso di informatica che hai fatto è un banalissimo vettore vedilo così e risolvi in tempo zero
Ho provato usando reinterpret_cast e funziona. Trovi la documentazione qui: http://www.cplusplus.com/doc/tutorial/typecasting/
Nasty nasty thing anyhow... hihihihi
infatti mi pareva strano che il casting non funzionasse visto che char e uchar sono praticamente la stessa cosa
DomusP45
14-03-2012, 16:38
implementare il crc è una cavolata immane devi solo capire che tipo di crc usa la pinza e dopo rifare il calcolo sul tuo array prima dell'invio
ti posto lo schema di calcolo di CRC che è nel manuale d'uso della pinza. Sapresti tradurlo in una funzione c++? Ti spiego, non capisco la parte finale (il return) come è strutturato. Non si capisce quei simboli come vanno interpretati. Se puoi, aiutami su questo. La concatenazione dei vettori vedrò come risolverla, perchè poi anche il CRC dovrò concatenarci.
Sapresti dirmi come la faccio sta cosa? Grazie infinitamente per la disponibilità
Questo è lo schema che hanno messo nel manuale:
http://i39.tinypic.com/2n9b1oo.jpg
http://i40.tinypic.com/20q1k51.jpg
__ZERO_UNO__
14-03-2012, 19:45
// La dimensione di unsigned short dipende dal sistema
// per il quale il programma è compilato.
typedef unsigned short UInt16;
// Un Byte, e non ci piove.
typedef unsigned char UInt8;
UInt16 CRC16(UInt16 crc, UInt8 data)
{
const UInt16 tbl[256] = { /* ... */ };
return ((crc & 0xFF00) >> 8) ^ tbl[(crc & 0x00FF) ^ (data & 0x00FF)];
}
^ = XOR.
>> = shift verso destra.
w & 0xFF00 = restituisce sedici bit dove gl'otto più significativi sono uguali ai corrispondenti in w e il resto zero.
w & 0x00FF = restituisce sedici bit dove gl'otto meno significativi sono uguali ai corrispondenti in w e il resto zero.
mmx[ngg]
14-03-2012, 19:58
Sapresti tradurlo in una funzione c++? Ti spiego, non capisco la parte finale (il return) come è strutturato.
Quella è una funziona...devi solo trascriverla, tra l'altro è scritta in modo molto accademico perchè dovrebbe essere :
return (crc >> 8) ^ tbl[(crc & 0xFF) ^ data];
Tradotto in una lingua più umana :
return (crc / 256) xor tbl[(char)crc xor data];
Tenendo presende che lo shift (>>) è preferibile alla divisione ma i compilatori provvedono da sè quando possono (in presenza di costanti come in questo caso).
DomusP45
14-03-2012, 21:39
;37101257']Quella è una funziona...devi solo trascriverla, tra l'altro è scritta in modo molto accademico perchè dovrebbe essere :
return (crc >> 8) ^ tbl[(crc & 0xFF) ^ data];
Tradotto in una lingua più umana :
return (crc / 256) xor tbl[(char)crc xor data];
Tenendo presende che lo shift (>>) è preferibile alla divisione ma i compilatori provvedono da sè quando possono (in presenza di costanti come in questo caso).
cavolo sta cosa dello shift proprio non la immaginavo...grazie! Domani mattina vado in laboratorio e provo a vedere che esce...e vi aggiorno!!
DomusP45
18-03-2012, 18:11
l'algoritmo del CRC è andato..solo che non mi restituisce quello che deve. Anzichè restituirmi ad esempio "0x4F 0xf4" mi restituisce "0xF4D0" e nemmeno si trova con quello che dovrebbe essere.
Come mai?
Poi volevo chiedervi :come costruire, all'interno della classe, una sorta di Timeout per la lettura dei dati?
Vorrei costruire una sorta di timer che attenda "tot millisecondi" e poi dichiari il timeout se non arriva risposta...come potrei fare?
Considerando che sto usando una libreria di comunicazione seriale che non prevede tale funzione, dovrei usare time.h...come fare per dare un timeout alla lettura?
Help me please...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.