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

Teraz ustawiam wartości tych elementów tablicy na 1 podczas jednej z operacji wewnętrznych.Jak ustawić zmienną tablicę do zera za pomocą memsetu?

W innym połączeniem funkcjonalnej, muszę ustawić wszystkie elementy tej tablicy 0. Jednym ze sposobów jest za pomocą pętli, ale wierzę, lepszy sposób, aby przypisać wszystkie elementy tablicy jest za pomocą memset

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

ale ja dostaję ten błąd: - „odlany z typu«volatile uint8_t * {aka lotny unsigned char *}»wpisać«void *»rzuca dala kwalifikatorów”

W przypadku nie możemy używać memset tu jest istnieje lepszy sposób na ustawienie wszystkich elementów tej zmiennej tablicy za jednym razem?

+6

'std :: fill (std :: begin (reset_mask), std :: end (reset_mask), 0);' działa. –

+0

@ R.MartinhoFernandes To powinna być odpowiedź (ponieważ jest to naprawdę jedyna poprawna odpowiedź). W C, oczywiście, musiałby użyć własnej pętli. –

+0

Do czego używasz zestawu zmiennego? Może być konieczne wyłączenie niektórych/wszystkich przerwań? –

Odpowiedz

-3

Oczywiście powinieneś móc używać memsetu. Wydaje mi się, że jest to problem odlewania typu. W porównaniu do C, C++ jest dość restrykcyjne, gdy używane są typy. Funkcja memset oczekuje otrzymania void *, ale dostarczasz uint8_t *. Spróbuj przesłać go:

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

Więcej informacji na temat odlewów to sprawdzić:

Regular cast vs. static_cast vs. dynamic_cast

Pozdrowienia

EDIT: dodałem brakujący nawias. I tak tego nie testowałem, chociaż myślę, że powinno działać.

+6

Odrzucenie kwalifikatora 'volatile' powoduje niezdefiniowane zachowanie (nietrudno zgadnąć, dlaczego wiesz, co' volatile' robi). (i nawet jeśli byłyby dobrze zdefiniowane, 'static_cast' nie może tego zrobić, potrzebowałbyś' const_cast') –

6

"Możesz" użyć memset odrzucając zmienność z const_cast, ale usunie zmienną semantykę. Więc jeśli nie jest to dla ciebie w porządku, utkniesz w wersji pętli. Chyba, że ​​twoja implementacja daje wersję memsetu, która bierze lot * i jest udokumentowana, aby wykonać twoją pracę. (Myślałem nieprawdopodobne zewnętrznych systemów wbudowanych, by mnie zaskoczyć nawet tam.)

2

Jak powiedział Balog Pal porzuciwszy volatile zadzwonić memset łamie volatile semantyka. Cała memset może zostać zoptymalizowana, albo zdarza się niezdefiniowane zachowanie.

Albo napisać własny pętli do zera poza tablicę, albo skorzystać z tej memset_volatile:

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

Prawdziwy memset zwraca również s i c jest int, ale ta wersja jest czystsze do mnie.

Nie jest jasne, czy kompilator może zoptymalizować tę funkcję, aby zapisywać więcej niż jeden bajt na raz, więc jeśli macierz jest bardzo duża, może być nieco powolna.

+1

dzięki za ten fragment! –

Powiązane problemy