Contest: trovate il bug!

Follia più assoluta. Ho tirato la testa contro il monitor per alcuni giorni. Non mi capacitavo del fatto che una funzione così semplice potesse creare così tanti problemi. Ed invece era lei, che pur nella sua semplicità, faceva un casino ASSURDO!!!

Il codice della funzione è questo:

void FillBuffers(void* IQ, void* Iout, void* Qout, int dim)
{
 
    int i, k;
    uint32_t current_sample, current_workin_var;
    uint16_t current_I;
 
    uint16_t current_Q;
 
    uint32_t* IN = (uint32_t*)IQ;
    uint16_t* I_32 = (uint16_t*)Iout;
 
    uint16_t* Q_32 = (uint16_t*)Qout;
 
    dim = dim/4;    // convert from 8 bit indexing to 64 indexing
 
    for ( i = 0 ; i < dim ; i++ )
    {
 
        current_sample = IN[i]; // take sample from input buffer
        current_I = 0;          // Flushing… 
 
        current_Q = 0;          // …
 
        for ( k = 0 ; k < NCYCLE ; k++ )
        {
          current_workin_var = (current_sample >> (NCYCLE - 1 - k)) & 0×01;
 
          if ( (k%2) == 0 ) {     // I
            current_I = (current_I < < 1) | current_workin_var;
          } else {                // Q
            current_Q = (current_Q << 1) | current_workin_var;
          }
        }
 
        // Remember:
        // -1 is coded 1
        //  1 is coded 0
 
        I_32[i] = current_I;    // Store sample on output buffer
 
        Q_32[i] = current_Q;    // …
    }
}

Potete scaricare anche un piccolo zip dove dentro trovate il sorgente di un programmino di test ed un Makefile. Offro un pizza (margherita!) a chi mi trova il bug, e me lo dimostra, debugger alla mano. Per quanto mi riguarda, il problema proviene da inttypes.h. Infatti l’ho già soppressa da tutto il mio codice… 🙂

1 Comment

  1. secondo me è la terzultima riga…ma anche la 22esima…si vede a vista d’occhio che è erratissima…cavolo mettici un pò d’attenzione…

Leave a Comment

Your email address will not be published. Required fields are marked *