2013-05-10 11 views
7

Si prega di dare un'occhiata al file di intestazione followngCome creare un array di byte in C++?

#pragma once 

class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    byte abc[3]; 
}; 

Questo ha generato l'errore

Error 1 error C2143: syntax error : missing ';' before '*' 

ho cercato di farlo in questo modo

byte *abc; 

ma ha anche fallito, lo stesso errore. Tuttavia, ho notato che posso chiamare altri array di tyes in questo modo per un esempio, un array int. Perché questo sta accadendo alla matrice di byte? Come risolvere questo? Vorrei assegnare i valori nel file cpp. Qualche idea?

+2

Non c'è '' * nel codice si presenti, in modo da non può eventualmente generare quel messaggio di errore. Si prega di essere precisi. – delnan

+2

Inoltre, da dove viene 'byte'? Non è un tipo standard. –

risposta

17

Prova

class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    unsigned char abc[3]; 
}; 

o

using byte = unsigned char; 

class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    byte abc[3]; 
}; 

** Nota: In compilatori più vecchie (non-C++ 11) sostituire la linea using con typedef unsigned char byte;

+0

'char' non deve essere un byte – Yola

7

Il byte non è un tipo standard in C o C++. Prova char, che di solito è lunga almeno 8 bit.

+0

Grazie per la risposta. Quindi, usando il char array? Può inviare valori nelle porte USB come byte? \ – Soldier

+1

Quando si utilizza un carattere, è esattamente un byte; quindi invia 'char' alla porta USB in C/C++ in realtà stai inviando un byte. –

+0

Grazie mille! +1 da me! – Soldier

10

Se si vuole esattamente un byte, uint8_t definito in cstdint sarebbe il più espressivo.

http://www.cplusplus.com/reference/cstdint/

+0

Inoltre, solo C++ 11 sembra. –

+0

@MichaelPrice, no, è disponibile anche in precedenti C++. Utilizzare anziché . Lo sto usando oggi in qualche codice mentre parliamo. :-) –

+0

@KellyBeard - è disponibile solo dopo la spedizione di C++ 11 (come metodo standard portatile). e non sono esattamente la stessa cosa. –

6

Forse è possibile sfruttare il tipo std::bitset disponibili in C++ 11. Può essere utilizzato per rappresentare una sequenza fissa di N bit, che può essere manipolata dalla logica convenzionale.

#include<iostream> 
#include<bitset> 

class MissileLauncher { 
public: 
    MissileLauncher() {} 
    void show_bits() const { 
    std::cout<<m_abc[2]<<", "<<m_abc[1]<<", "<<m_abc[0]<<std::endl; 
    } 

    bool toggle_a() { 
    // toggles (i.e., flips) the value of `a` bit and returns the 
    // resulting logical value 
    m_abc[0].flip(); 
    return m_abc[0]; 
    } 

    bool toggle_c() { 
    // toggles (i.e., flips) the value of `c` bit and returns the 
    // resulting logical value 
    m_abc[2].flip(); 
    return m_abc[2]; 
    } 

    bool matches(const std::bitset<3>& mask) { 
    // tests whether all the bits specified in `mask` are turned on in 
    // this instance's bitfield 
    return ((m_abc & mask) == mask); 
    } 

private: 
    std::bitset<3> m_abc; 
}; 

typedef std::bitset<3> Mask; 
int main() { 
    MissileLauncher ml; 

    // notice that the bitset can be "built" from a string - this masks 
    // can be made available as constants to test whether certain bits 
    // or bit combinations are "on" or "off" 
    Mask has_a("001");  // the zeroth bit 
    Mask has_b("010");  // the first bit 
    Mask has_c("100");  // the second bit 
    Mask has_a_and_c("101"); // zeroth and second bits 
    Mask has_all_on("111"); // all on! 
    Mask has_all_off("000"); // all off! 

    // I can even create masks using standard logic (in this case I use 
    // the or "|" operator) 
    Mask has_a_and_b = has_a | has_b; 
    std::cout<<"This should be 011: "<<has_a_and_b<<std::endl; 

    // print "true" and "false" instead of "1" and "0" 
    std::cout<<std::boolalpha; 

    std::cout<<"Bits, as created"<<std::endl; 
    ml.show_bits(); 
    std::cout<<"is a turned on? "<<ml.matches(has_a)<<std::endl; 
    std::cout<<"I will toggle a"<<std::endl; 
    ml.toggle_a(); 
    std::cout<<"Resulting bits:"<<std::endl; 
    ml.show_bits(); 
    std::cout<<"is a turned on now? "<<ml.matches(has_a)<<std::endl; 
    std::cout<<"are both a and c on? "<<ml.matches(has_a_and_c)<<std::endl; 
    std::cout<<"Toggle c"<<std::endl; 
    ml.toggle_c(); 
    std::cout<<"Resulting bits:"<<std::endl; 
    ml.show_bits();  
    std::cout<<"are both a and c on now? "<<ml.matches(has_a_and_c)<<std::endl; 
    std::cout<<"but, are all bits on? "<<ml.matches(has_all_on)<<std::endl; 
    return 0; 
} 

compilazione utilizzando gcc 4.7.2

g++ example.cpp -std=c++11 

ottengo:

This should be 011: 011 
Bits, as created 
false, false, false 
is a turned on? false 
I will toggle a 
Resulting bits: 
false, false, true 
is a turned on now? true 
are both a and c on? false 
Toggle c 
Resulting bits: 
true, false, true 
are both a and c on now? true 
but, are all bits on? false 
+0

wow .. Grazie mille per la risposta! +1 da me! – Soldier

1

Si potrebbe utilizzare Qt, che, nel caso in cui non si conosce, è C++ con un gruppo di librerie e classi aggiuntive e quant'altro. Qt ha una classe QByteArray molto comoda che sono abbastanza sicura per soddisfare le tue esigenze.

http://qt-project.org/

2

Byte non è un tipo di dati standard in C/C++, ma può ancora essere utilizzato il modo in cui suppongo si desidera. Ecco come: Ricordare che un byte è una dimensione di memoria di otto bit che può rappresentare uno qualsiasi degli interi tra -128 e 127 inclusi. (Ci sono 256 interi in tale intervallo, otto bit possono rappresentare 256 - due elevati alla potenza otto - valori diversi.). Ricorda anche che un char in C/C++ è un byte (otto bit). Quindi, tutto quello che devi fare per avere un tipo di dati in byte in C/C++ è mettere questo codice nella parte superiore del tuo file sorgente: #define byte char Così ora puoi dichiarare byte abc [3];

-1

Byte non è un tipo standard in C/C++, quindi è rappresentato da char.

Un vantaggio di questo è che è possibile trattare uno basic_string come un array di byte che consente la memorizzazione sicura e il passaggio di funzioni.Ciò consente di evitare perdite di memoria e errori di segmentazione che potrebbero verificarsi quando si utilizzano le varie forme di char[] e char*.

Ad esempio, questo crea una stringa come una matrice di byte di valori nulli:

typedef basic_string<unsigned char> u_string; 

u_string bytes = u_string(16,'\0'); 

Ciò consente operazioni bit per bit standard con altri char valori, inclusi quelli memorizzati altre string variabili. Ad esempio, per i valori di XOR char di un altro u_string attraverso bytes:

u_string otherBytes = "some more chars, which are just bytes"; 
for(int i = 0; i < otherBytes.length(); i++) 
    bytes[i%16] ^= (int)otherBytes[i]; 
+0

Cura di spiegare il voto negativo? Usiamo questo modello in più sistemi di livello di produzione su base giornaliera con perdite di memoria pari a zero. –

+0

Non sono il downvoter, ma usare le stringhe per memorizzare dati binari è una pessima pratica. Si sta facendo affidamento sull'implementazione della stringa per utilizzare caratteri a 8 byte. In pratica, specialmente sui sistemi moderni, molte implementazioni di stringhe codificano internamente le loro stringhe come UTF-8 o UTF-16 (codifica a lunghezza variabile). Ciò significa che la tua chiamata '.length' si riferirà al numero di glifi, NON al numero di byte. Se stai usando questo sui sistemi di produzione, dovresti essere preoccupato. Array di stringhe e byte hanno usi molto diversi. –

+0

@Chris Quindi stai dicendo che dovrebbe essere usato un array 'char' per garantire caratteri a 8 byte? La cosa triste di questa soluzione è l'introduzione della gestione manuale della memoria di 'char *', che nella mia esperienza è la causa di circa la metà delle perdite di memoria che si vedono nel codice C/C++. –

Problemi correlati