2011-10-16 13 views
5

Sto scrivendo del codice in cui ho bisogno di utilizzare due variabili in un ciclo for. Il codice sottostante sembra ok?Due variabili in un ciclo "for" in C

Mi dà il risultato previsto.

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

Ma sto ottenendo un avviso del compilatore che dice:

file.c: 499: 73: avvertimento: sinistro operando di espressione virgola non ha alcun effetto

Cosa significa questo?

+5

wow, sto fissando il codice e non importa quanto sia difficile provare riesco a malapena a capire che cosa sta facendo :-) Ho sempre ammirato i programmatori C. –

+2

@DarinDimitrov Se vuoi posso riscriverlo in C#, ma sarà lo stesso :-) – xanatos

+0

@xanatos, oh spero sinceramente che non scriverai nulla di simile in C#. Intendo puntatori? Dai, il BCL ha sicuramente qualcosa di integrato per raggiungere questo obiettivo (qualunque sia il codice che sta cercando di ottenere). –

risposta

24

Il problema è la condizione di prova:

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

Questo non controlla entrambe le parti. (Beh, lo fa, ma solo il risultato della seconda parte viene utilizzata.)

Change a

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

se si desidera entrambe le condizioni da verificare.

16

Mat è corretto, ma probabilmente si dovrebbe prendere in considerazione la semplificazione il codice per:

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

(ovviamente è possibile issare il calcolo del in_payload + offset fuori dal giro troppo, ma l'ottimizzatore sarà quasi certamente farà per voi).

1

Per i problemi semanticamente vedi la risposta di caf. Prima prova a chiarire i tuoi pensieri prima di iniziare a digitare.

Un equivoco è che si confondono due concetti diversi di C, l'inizializzazione e l'assegnazione. Ovviamente nel tuo codice stai pensando nelle linee di un'inizializzazione in cui la cosa con la virgola funzionerebbe perfettamente. Quindi la prossima volta che incontri un problema simile, usa solo le variabili locali. Questi sono costrutti validi in C99, e comunque una cosa buona da usare.

Lei non ci hanno dato il tipo delle variabili ma assumendo size_t la sua dichiarazione for sarebbe simile

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