Il seguente codice risiede in un dispositivo che emetterà un deviceId (LXdeviceInfo) quando viene enumerato tramite una connessione socket IrDA. Questo è importante solo per spiegare perché vorrei mantenere i tipi di dati il più simili possibile, ma essere in grado di compilare usando ansi CC'è un modo per modificare questo blocco di assegnazione struct C++ per lavorare in modo diretto C
Con #inclusi di windows.h e af_irda.h, il seguente codice viene compilato senza errori in un compilatore C++, ma si rompono in un compilatore C appena sotto l'assegnazione della struttura (vedi ERRORE qui). Idealmente, vorrei inizializzare il membro della struct 'ID' in modo che fosse una matrice di caratteri mantenendolo digitato esattamente come nel codice originale in modo da poter verificare il valore di LXdeviceInfo così come apparirebbe quando lo si interroga da un chiamare il dispositivo da una connessione socket PC.
C'è un modo per modificare questo blocco di assegnazione in modo che funzioni in C corretto?
#include <windows.h>
#include <af_irda.h>
#define IR_HINT_COMPUTER 0x04
#define IR_HINT_EXT 0x80
#define IR_HINT_OBEX 0x20
#define IR_HINT_IRCOMM 0x04
#define IR_CHAR_ASCII 0
#define PROD_FAMILY_NAME ("product name goes here")
#define uint8_t unsigned char
const struct {
uint8_t hint1;
uint8_t hint2;
uint8_t charset;
uint8_t ID[sizeof(PROD_FAMILY_NAME)];
} devInfoStorage =
{
IR_HINT_COMPUTER | IR_HINT_EXT, // hint1
IR_HINT_OBEX | IR_HINT_IRCOMM, // hint2
IR_CHAR_ASCII, // charset
PROD_FAMILY_NAME // Prod ID string
}; // ERROR here: Innvalid initialization type: found 'pointer to char' expected 'unsigned char'
const uint8_t *LXdeviceInfo = (uint8_t *) &devInfoStorage;
/* The size of the device info */
const uint8_t LXdeviceInfoLen = sizeof(devInfoStorage);
void main(void)
{
#define DEVICE_LIST_LEN 10
unsigned char DevListBuff[sizeof (DEVICELIST) -
sizeof (IRDA_DEVICE_INFO) +
(sizeof (IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];
int DevListLen = sizeof (DevListBuff);
PDEVICELIST pDevList;
pDevList = (PDEVICELIST) & DevListBuff;
//code continues.
}
Prova a rimuovere le parentesi da PROD_FAMILY_NAME. –
Per quanto posso dire che dovrebbe essere valido anche C. Forse la parentesi attorno alla stringa lo incasina? O forse l'assegnazione dell'array non sta prendendo perché un char non firmato e un char non sono abbastanza corrispondenti. –
@ryyker, che ne dici di sostituire quelli che definiscono con i loro equivalenti 'const' e' typedef'? – greatwolf