2013-06-17 35 views
11
volatile uint8_t reset_mask[768] = {0} 

Bây giờ tôi đang đặt giá trị của thành phần mảng này thành 1 trong một trong các thao tác bên trong.Làm cách nào để đặt mảng biến động thành 0 bằng cách sử dụng memset?

Trong một cuộc gọi chức năng, tôi cần phải đặt tất cả các phần tử của mảng này để 0. Một cách là sử dụng vòng lặp for nhưng tôi tin rằng cách tốt hơn để gán tất cả các yếu tố của mảng là sử dụng memset

memset(reset_mask, 0, sizeof(reset_mask)); 

nhưng tôi nhận được lỗi này: - "đúc từ loại 'dễ bay hơi uint8_t * {aka dễ bay hơi unsigned char *}' gõ 'void *' phôi đi vòng loại"

Trong trường hợp chúng tôi không thể sử dụng memset ở đây, là có cách nào tốt hơn để thiết lập tất cả các phần tử của mảng biến động này trong một lần?

+6

'std :: fill (std :: bắt đầu (reset_mask), std :: end (reset_mask), 0);' works. –

+0

@ R.MartinhoFernandes Đó phải là câu trả lời (vì đó thực sự là câu trả lời đúng). Trong C, tất nhiên, anh sẽ phải sử dụng vòng lặp của riêng mình. –

+0

Bạn đang sử dụng mảng biến động nào? Bạn có thể phải tắt một số/tất cả các ngắt? –

Trả lời

-3

Tất nhiên bạn sẽ có thể sử dụng bộ nhớ. Có vẻ như một vấn đề về loại đúc với tôi. So với C, C++ là khá hạn chế khi các loại được sử dụng. Bộ nhớ chức năng mong nhận được một khoảng trống *, nhưng bạn đang cung cấp uint8_t *. Hãy thử đúc nó:

memset (static_cast<void *>(reset_mask), 0, size_of(reset_mask)); 

Để biết thêm chi tiết về đúc kiểm tra này:

Regular cast vs. static_cast vs. dynamic_cast

Trân

EDIT: Tôi đã thêm ngoặc thiếu. Tôi đã không thử nghiệm này anyway, mặc dù tôi nghĩ rằng nó sẽ làm việc.

+6

Lấy đi một định mức 'dễ bay hơi 'mang lại hành vi không xác định (nó không khó để đoán tại sao nếu bạn biết những gì' biến động' không). (và thậm chí nếu nó đã được xác định rõ ràng, 'static_cast' không thể làm điều đó; bạn sẽ cần' const_cast') –

6

Bạn "có thể" sử dụng memset vứt bỏ sự bay hơi với const_cast, nhưng nó sẽ loại bỏ các ngữ nghĩa dễ bay hơi. Vì vậy, trừ khi đó là okay cho bạn, bạn đang mắc kẹt với phiên bản vòng lặp. Trừ khi thực hiện của bạn cung cấp cho bạn một phiên bản của memset mà mất volatile * và được tài liệu để làm công việc của bạn. (Tôi nghĩ rằng không có bên ngoài hệ thống nhúng, sẽ làm tôi ngạc nhiên ngay cả ở đó.)

2

Như Balog Pal cho biết, hãy bỏ đi volatile để gọi memset vi phạm các ngữ nghĩa volatile. Toàn bộ memset có thể được tối ưu hóa đi, hoặc không xác định hành vi xấu xảy ra.

Hoặc viết vòng lặp của riêng bạn để không ra mảng, hoặc sử dụng này memset_volatile:

void memset_volatile(volatile void *s, char c, size_t n) 
{ 
    volatile char *p = s; 
    while (n-- > 0) { 
     *p++ = c; 
    } 
} 

Các thực memset cũng trả sc là một int, nhưng phiên bản này là sạch hơn đối với tôi.

Khá rõ ràng nếu trình biên dịch được phép tối ưu hóa hàm này để viết nhiều hơn một byte tại một thời điểm, vì vậy nếu mảng rất lớn, nó có thể hơi chậm.

+1

cảm ơn cho đoạn mã này! –