2011-10-16 44 views
5

Piszę kod, w którym muszę użyć dwóch zmiennych w pętli for. Czy poniższy kod wydaje się być w porządku?Dwie zmienne w pętli "for" w C

To daje mi oczekiwany rezultat.

for (loop_1 = offset,loop_2 = (offset + 2); loop_1 >= (offset - 190),loop_2 <= (190 + offset + 2); loop_1--,loop_2++) 
{ 
    if ( (*(uint8_t*)(in_payload + loop_1) == get_a1_byte(bitslip)) && 
     ((*(uint8_t*)(in_payload + loop_2) == get_a2_byte(bitslip))) 
     ) 
    { 
      a1_count++; 
    } 
} 

Ale ja dostaję ostrzeżenie kompilatora, który mówi:

file.c: 499: 73: ostrzeżenie: lewy operand wypowiedzi przecinek nie ma wpływu

Co czy to znaczy?

+5

wow, jestem patrząc na ten kod i nie ważne jak bardzo się staram ledwo mogę zrozumieć, co to robi :-) Zawsze podziwiałem programistów C. –

+2

@DarinDimitrov Jeśli chcesz, mogę przepisać go w C#, ale będzie to samo :-) – xanatos

+0

@xanatos, oh Mam szczerą nadzieję, że nie napiszesz czegoś takiego w C#. Mam na myśli wskazówki? Chodź, BCL z pewnością ma coś wbudowanego, aby to osiągnąć (cokolwiek ten kod próbuje osiągnąć). –

Odpowiedz

24

Problem jest warunek testowy:

loop_1 >= (offset - 190),loop_2 <= (190 + offset + 2) 

nie sprawdzić obie części. (No, tak, ale tylko wynik drugiej części jest używana).

Zmień go

(loop_1 >= (offset - 190)) && (loop_2 <= (190 + offset + 2)) 

jeśli chcesz, aby oba te warunki są sprawdzane.

16

Mat jest poprawna, ale powinieneś rozważyć uproszczenie kodu do:

for (i = 0; i <= 190; i++) 
{ 
    uint8_t *pl1 = (uint8_t *)(in_payload + offset - i); 
    uint8_t *pl2 = (uint8_t *)(in_payload + offset + i + 2); 

    if (*pl1 == get_a1_byte(bitslip) && *pl2 == get_a2_byte(bitslip)) 
    { 
     a1_count++; 
    } 
} 

(Można oczywiście podnieść obliczenia in_payload + offset z pętli też, ale Optymalizator prawie na pewno zrobić to za Ciebie).

1

Dla twoich problemów semantycznych patrz odpowiedź caf. Najpierw staraj się wyciągnąć myśli przed rozpoczęciem pisania.

Jednym z nieporozumień jest to, że mieszasz dwie różne koncepcje C, inicjalizacji i przypisania. Oczywiście w twoim kodzie myślisz w linii inicjalizacji, gdzie rzecz z przecinkiem będzie działała idealnie. Więc następnym razem, gdy napotkasz podobny problem, po prostu użyj zmiennych lokalnych. Są to poprawne konstrukcje w C99, i tak czy inaczej dobra rzecz.

Nie dają nam typ zmiennych, ale zakładając size_t swoje oświadczenie for wyglądałby

for (size_t loop_1 = offset, loop_2 = (offset + 2); 
    loop_1 >= (offset - 190) && loop_2 <= (190 + offset + 2); 
    loop_1--, loop_2++)