2013-05-10 49 views
7

hãy có một cái nhìn tại các tập tin tiêu đề followngLàm thế nào để tạo một mảng byte trong C++?

#pragma once 

class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    byte abc[3]; 
}; 

này tạo ra các lỗi

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

tôi đã cố gắng để làm điều đó theo cách này

byte *abc; 

nhưng nó cũng thất bại, cùng lỗi. Tuy nhiên, tôi nhận thấy tôi có thể gọi khác được xây dựng trong mảng tyes theo cách này cho một ví dụ, một mảng int. Tại sao điều này xảy ra với mảng byte? Làm thế nào để giải quyết điều này? Tôi muốn gán các giá trị trong tệp cpp. Bất kỳ ý tưởng?

+2

Không '*' trong mã bạn trình bày, vì vậy nó không thể nào tạo ra mà thông báo lỗi. Xin hãy chính xác. – delnan

+2

Ngoài ra, 'byte' đến từ đâu? Nó không phải là một loại tiêu chuẩn. –

Trả lời

17

Hãy thử

class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    unsigned char abc[3]; 
}; 

hoặc

using byte = unsigned char; 

class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    byte abc[3]; 
}; 

** Lưu ý: Trong các trình biên dịch cũ (không-C++ 11) thay thế dòng using với typedef unsigned char byte;

+0

'char' không cần phải là một byte – Yola

7

Byte không phải là loại tiêu chuẩn trong C hoặc C++. Hãy thử char, thường là và dài ít nhất 8 bit.

+0

Cảm ơn bạn đã trả lời. Vì vậy, bằng cách sử dụng mảng char? Nó có thể gửi các giá trị vào các cổng USB giống như các byte không? \ – Soldier

+1

Khi bạn sử dụng một char, nó chính xác là một byte; do đó, gửi 'char' vào cổng USB trong C/C++ bạn đang thực sự gửi một byte. –

+0

Cảm ơn rất nhiều! +1 từ tôi! – Soldier

10

Nếu bạn muốn chính xác một byte, uint8_t được định nghĩa trong cstdint sẽ là biểu cảm nhất.

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

+0

Ngoài ra, C++ 11 chỉ có vẻ như vậy. –

+0

@MichaelPrice, không, nó có sẵn trong C++ trước đó. Sử dụng thay vì . Tôi đang sử dụng nó ngày hôm nay trong một số mã như chúng ta nói. :-) –

+0

@KellyBeard - chỉ khả dụng sau khi C++ 11 được xuất xưởng (như một phương pháp di động tiêu chuẩn). không hoàn toàn giống nhau. –

6

lẽ bạn có thể tận dụng std::bitset loại có sẵn trong C++ 11. Nó có thể được sử dụng để đại diện cho một chuỗi cố định của N bit, có thể được điều khiển bằng logic thông thường.

#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; 
} 

Biên soạn sử dụng gcc 4.7.2

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

tôi nhận được:

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 .. Cảm ơn rất nhiều vì đã trả lời! +1 từ tôi! – Soldier

1

Bạn có thể sử dụng Qt đó, trong trường hợp bạn không biết, là C++ với một loạt các các thư viện và lớp học bổ sung và không có gì. Qt có một lớp QByteArray rất tiện lợi mà tôi khá chắc chắn sẽ phù hợp với nhu cầu của bạn.

http://qt-project.org/

2

Byte không phải là một kiểu dữ liệu chuẩn trong C/C++ nhưng nó vẫn có thể được sử dụng theo cách tôi giả sử bạn muốn nó. Đây là cách: Nhớ lại rằng một byte là một kích thước bộ nhớ tám bit có thể đại diện cho bất kỳ số nguyên nào trong khoảng từ -128 đến 127. (Có 256 số nguyên trong phạm vi đó, tám bit có thể đại diện cho 256 - hai số được tăng lên tới tám giá trị khác nhau.). Cũng nhớ lại rằng một char trong C/C++ là một byte (tám bit). Vì vậy, tất cả những gì bạn cần làm để có kiểu dữ liệu byte trong C/C++ là đặt mã này ở đầu tệp nguồn của bạn: #define byte char Vì vậy, bây giờ bạn có thể khai báo byte abc [3];

-1

Byte không phải là loại tiêu chuẩn trong C/C++, do đó nó được thể hiện bằng char.

Lợi thế của việc này là bạn có thể xử lý basic_string làm mảng byte cho phép lưu trữ an toàn và chức năng chuyển.Điều này sẽ giúp bạn tránh được rò rỉ bộ nhớ và lỗi phân đoạn mà bạn có thể gặp phải khi sử dụng các hình thức khác nhau của char[]char*.

Ví dụ, điều này tạo ra một chuỗi như một mảng byte các giá trị null:

typedef basic_string<unsigned char> u_string; 

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

Điều này cho phép các hoạt động Bitwise tiêu chuẩn với char giá trị khác, bao gồm cả những lưu trữ trong string biến khác. Ví dụ, để XOR char giá trị của người khác u_string trên 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

Chăm sóc để giải thích phiếu bầu xuống? Chúng tôi đang sử dụng mẫu này trong nhiều hệ thống cấp sản xuất hàng ngày với rò rỉ bộ nhớ bằng không. –

+0

Tôi không phải là downvoter, nhưng sử dụng chuỗi để lưu trữ dữ liệu nhị phân là một thực tế rất xấu. Bạn đang dựa vào việc triển khai chuỗi để sử dụng các ký tự 8 byte. Trong thực tế, đặc biệt là trên các hệ thống hiện đại, nhiều triển khai chuỗi mã hóa nội bộ các chuỗi của chúng như UTF-8 hoặc UTF-16 (mã hóa độ dài biến đổi). Điều này có nghĩa là cuộc gọi '.length' của bạn sẽ đề cập đến số lượng glyphs, KHÔNG phải số byte. Nếu bạn đang sử dụng nó trên hệ thống sản xuất, bạn nên lo lắng. Chuỗi và mảng byte có cách sử dụng rất khác nhau. –

+0

@Chris Vì vậy, bạn đang nói một mảng 'char' nên được sử dụng để đảm bảo các ký tự 8 byte? Điều buồn về giải pháp đó là việc giới thiệu quản lý bộ nhớ thủ công của 'char *', mà theo kinh nghiệm của tôi là nguyên nhân gây ra khoảng một nửa rò rỉ bộ nhớ mà người ta thấy trong mã C/C++. –

Các vấn đề liên quan