|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[C++] strcat e gli array unsigned char...
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!
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#2 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 22006
|
casting?
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
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!
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#4 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 22006
|
Quote:
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!
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
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.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Ho provato usando reinterpret_cast e funziona. Trovi la documentazione qui: http://www.cplusplus.com/doc/tutorial/typecasting/
Nasty nasty thing anyhow... hihihihi
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 |
|
|
|
|
|
#7 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 22006
|
Quote:
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
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Innanzi tutto grazie a tutti per la disponibilità.
Quote:
Quote:
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... 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.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
||
|
|
|
|
|
#9 | ||
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 22006
|
Quote:
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 Quote:
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
||
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Sapresti dirmi come la faccio sta cosa? Grazie infinitamente per la disponibilità Questo è lo schema che hanno messo nel manuale: ![]()
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Codice:
// 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)];
}
>> = 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.
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 Ultima modifica di __ZERO_UNO__ : 14-03-2012 alle 20:55. |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
|
Quote:
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).
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
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...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. Ultima modifica di DomusP45 : 26-03-2012 alle 19:24. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:25.





















