2014-12-05 13 views
5

Tak więc właśnie próbowałem wypełnić bufor następującymi liczbami 0-255. Nie myślałem o tym zbyt wiele i skończyłem w nieskończonej pętli.Pętla ponad 256 wartości przy użyciu 8-bitowej liczby całkowitej bez znaku jako licznika

uint8_t i; 
uint8_t txbuf[256]; 

for (i=0; i<256; i++) { 
    txbuf[i] = i; 
} 

problem jest, że nigdy nie będzie i 256 jak to przewraca się do zera po 255.

moje pytanie brzmi, czy jest jakiś sposób aby to zrobić pętlę bez wpadania i do wartości 16 bitowej ?

Uwaga: Wiem, że mógłbym zmienić pętlę na i<255 i dodać kolejną linię do miejsca końcowego, ale próbuję wymyślić, że jest ładniej wyglądający sposób.

+1

Nie stosować 8-bitowego 'I'. Ponieważ 'uint8_t' może mieć tylko wartości 0 ... 255,' i <256' zawsze będzie prawdziwe. Użyj zwykłego 'int' dla licznika pętli i upuść dodatkowe bity przy przypisaniu. –

+0

zaakceptowana odpowiedź działa z 8-bitową wartością. – user3817250

+0

Jeśli chcesz móc zakończyć pętlę po iteracjach 0, nie możesz zakończyć jej po 256 i na odwrót. 0 do 256 = 257. – potrzebie

Odpowiedz

9
uint8_t txbuf[256]; 
uint8_t i = 0; 

do { 
    txbuf[i] = i; 
} while (i++ != 255); 

lub

uint8_t txbuf[256]; 
uint8_t i = 255; 

do { 
    txbuf[i] = i; 
} while (i--); 
+1

Bardzo ładne! Ponieważ niepodpisane zmienne nie mogą być przepełnione zgodnie z sekcją 6.2.5.9 normy C99, zachowanie jest dobrze zdefiniowane. – dasblinkenlight

+1

Sam pokonał cię przez minutę. Doskonała odpowiedź nie mniej. – user3817250

+2

@ user3817250 Odpowiedź zavg była o 17:14:02, a odpowiedź Sama była o 17:15:15, 5 grudnia. Wygląda jak zavg pokonać Sam przez 1 minutę i 13 sekund, jeśli wybierasz odpowiedź na podstawie czasów. – Matt

2

uint8_t waha się od 0-255 więc nigdy nie staje 256. Ponieważ widzimy, że tablica jest również typu uint8_t wartość może przechowywać także od 0-255 więc co sprawia, że ​​pętla dla wartości większej niż 255?

Po prostu trzymaj czek jako i<255, a kiedy wyjdziesz z pętli, wiesz że wartość i wynosi 255, użyj jej odpowiednio.

Inne użycie do while zgodnie z sugestiami innych osób.

5

Użyj do ... while pętlę tak, aby wykonać akcję przed sprawdzeniem warunku:

uint8_t i = 0; 
uint8_t txbuf[256]; 

do { 
    txtbuf[i] = i; 
} while(i++ < 255); 
+0

Myślę, że dobrze byłoby zauważyć, że na końcu tej pętli 'i == 0 'jednak miałoby to znaczenie, gdyby w pętli było' break' i chciało się śledzić indeks w przerwie punkt. – user3817250

3

Pętle do..while w innych odpowiedzi, co prawdopodobnie chcesz, ale jeśli chcesz używać pętli for, możesz dodać instrukcję break:

uint8_t i; 
uint8_t txbuf[256]; 

int main(void) 
{ 

    for (i=0; ; i++) { 
     txbuf[i] = i; 
     if (i == 255) break; 
    } 

} 
1

Poniższy gcc (5.0) posiada funkcję sprawdzania, czy nastąpiło przepełnienie.

uint8_t i = 0; 
uint8_t txbuf[256]; 

do 
{ 
    txbuf[i] = i; 
}while(!__builtin_add_overflow(i,1,i)); 

Więcej szczegółów na https://gcc.gnu.org/gcc-5/changes.html

Powiązane problemy