Voglio realizzare una funzione che prende in ingresso un vettore, composto di 0 e 1, e inserisce o toglie numero fino ad arrivare a un certo numero di uni. Es:
numero uni: 3
input: 0 0 1 0 output: 1 0 1 1
dove mettere o togliere gli uni si può fare in maniera casuale.
Ho realizzato una funzione ma non gira, mi si blocca in uno strano punto:
codice:
void bilancia(int *v, int costante_uni, int dim)
{
    int i,j, num_uni, differenza;
    int *zeri, *uni, *da_cambiare;
    
    num_uni = conta_n(v, dim, 1);
    /*se ci sono troppi uno*/
    if(num_uni>costante_uni)
    {
        printf("troppi uni\n");
        /*metto gli indici degli uni in un vettore*/
        uni = (int *)malloc(sizeof(int) * num_uni);
        for(i=0, j=0;i<dim;i++)
        {
            /*scrivo gli indici degli uni in un altro vettore*/
            if(v[i] == 1)
            {
                uni[j] = i;
                j++;
            }
        }
        differenza = num_uni - costante_uni;
        /*alloco il vettore che conterrà gli indici dei numeri da cambiare*/
        da_cambiare = (int *)malloc(sizeof(int) * differenza);
        genera_indici(num_uni, differenza,uni, da_cambiare);
        /*ora faccio le modifiche*/
        for(i=0;i<differenza;i++)
        {
            v[uni[da_cambiare[i]]] = 0;
        }
        
    }
    else if(num_uni < costante_uni)/*ci sono troppi zeri*/
    {
        printf("Troppi zeri\n");
        /*metto gli indici degli zeri in un vettore*/
        zeri = (int *)malloc(sizeof(int) * num_uni);
        for(i=0, j=0;i<dim;i++)
        {
            /*scrivo gli indici degli zeri in un altro vettore*/
            if(v[i] == 0)
            {
                zeri[j] = i;

                j++;
            }
        }
        differenza = costante_uni - num_uni;
        /*alloco il vettore che conterrà gli indici dei numeri da cambiare*/
        da_cambiare = (int *)malloc(sizeof(int) * differenza);
        genera_indici(num_uni, differenza, zeri, da_cambiare);
        /*ora faccio le modifiche*/
        for(i=0;i<differenza;i++)
        {
            individuo[zeri[da_cambiare[i]]] = 1;
        }
    }
}
Vi scrivo anche le due funzioni che utilizzo in essa, una che conta il numero di occorrenze di un numero in un vettore di interi:
codice:
/*funzione che conta il numero di occorrenze del numero passato in un vettore*/
int conta_n(int *v, int dim, int n)
{
    int contatore=0, i;
    
    for(i=0;i<dim;i++)
    {
        if(v[i] == n)
        {
            contatore++;
        }                 
    }
    
    return(contatore);
}
E una funzione che genera casualmente due indici di un vettore passatogli:
codice:
void genera_indici(int dim, int k, int *v, int *r)
{
   int i, x,j, doppioni;
   
   for(i=0;i<k;i++)
   {
           doppioni = 0;
           r[i] = RANDOM(dim);

           for(j=0;j<k;j++)
           {
              if(r[i] ==r[j])
              {
                  doppioni++;
              }
           }
           if(doppioni>1)
           {
               /*voglio un altro numero che sostituisca quello corrente*/
               i--;
           }

   }
}
Aiuto!