2011-10-16 85 views
5

Tôi đang viết một số mã mà tôi cần sử dụng hai biến trong một vòng lặp for. Mã dưới đây có ổn không?Hai biến trong vòng lặp 'for' trong C

Nó cho tôi kết quả mong đợi.

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

Nhưng tôi nhận được một cảnh báo trình biên dịch mà nói:

file.c: 499: 73: cảnh báo: toán hạng bên trái của biểu thức dấu phẩy không có tác dụng

gì điều này có nghĩa là gì?

+5

wow, tôi đang nhìn chằm chằm vào mã này và không có gì khó khăn khi tôi cố gắng tôi chỉ có thể hiểu những gì nó đang làm :-) Tôi đã luôn luôn ngưỡng mộ C lập trình viên. –

+2

@DarinDimitrov Nếu bạn muốn tôi có thể viết lại nó trong C#, nhưng nó sẽ giống nhau :-) – xanatos

+0

@xanatos, oh Tôi chân thành hy vọng bạn sẽ không viết bất cứ điều gì như thế này trong C#. Ý tôi là con trỏ? Thôi nào, BCL chắc chắn có một cái gì đó tích hợp để đạt được điều này (bất kể mã này đang cố gắng đạt được). –

Trả lời

24

Vấn đề là điều kiện thử nghiệm:

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

này không kiểm tra cả hai phần. (Vâng, đúng như vậy, nhưng chỉ là kết quả của phần thứ hai được sử dụng.)

Thay đổi nó để

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

nếu bạn muốn cả hai điều kiện để được kiểm tra.

16

Mat là đúng, nhưng có lẽ bạn nên xem xét đơn giản hóa mã của bạn để:

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

(Bạn rõ ràng là có thể nhấc tính in_payload + offset ra khỏi vòng lặp quá, nhưng optimizer gần như chắc chắn sẽ làm điều đó cho bạn).

1

Đối với các vấn đề ngữ nghĩa của bạn, hãy xem câu trả lời của quán cà phê. Trước tiên, hãy cố gắng suy nghĩ thẳng ra trước khi bắt đầu nhập.

Một sự hiểu lầm là bạn đang trộn lẫn hai khái niệm khác nhau của C, khởi tạo và gán. Rõ ràng trong mã của bạn, bạn đang suy nghĩ trong các dòng của một khởi tạo, nơi điều với dấu phẩy sẽ làm việc hoàn hảo. Vì vậy, lần sau khi bạn gặp sự cố tương tự, chỉ cần sử dụng các biến cục bộ. Đây là những cấu trúc hợp lệ trong C99 và dù sao cũng là một điều tốt để sử dụng.

Bạn đã không cung cấp cho chúng tôi các loại của các biến nhưng giả sử size_t tuyên bố for của bạn sẽ trông như thế

for (size_t loop_1 = offset, loop_2 = (offset + 2); 
    loop_1 >= (offset - 190) && loop_2 <= (190 + offset + 2); 
    loop_1--, loop_2++) 
Các vấn đề liên quan