[C]integrità dati

di il
5 risposte

[C]integrità dati

Ciao a tutti.
Ho un problema di integrità dei dati, in particolare nel mio codice prendo un vettore da una matrice quadrata e ne passo il puntatore a una funzione che, in maniera casuale, decide se modificarlo o meno. Poi restituisce il puntatore e a quel punto copio il vettore in una nuova matrice.
Ecco il codice:

riga_corrente=0;
while(i<cicli)
{
    /*prendo 2 righe random della matrice pool1 e li copio in due vettori*/
    for(j=0;j<nodi;j++)
    {
           ind1[j] = pool1[rnd_1]][j];
           ind2[j] = pool1[rnd_2][j];
    }
   
    crossover(ind1, ind2, nodi, pc);

    for(j=0;j<nodi;j++)
    {              
          pool2[riga_corrente][j] = ind1[j];
     }
    riga_corrente++;
    for(j=0;j<nodi;j++)
    {
          pool2[riga_corrente][j] = ind2[j];       
     }
    riga_corrente++;
}
Questa invece è la funzione:

/**************************************/
/*Definizione della funzione crossover*/
/**************************************/

/*funzione che applica l'operatore di crossover agli individui che gli vengono passati come parametri*/
void crossover(int* individuo1, int* individuo2, int nodi, int pc)
{
    int i;
    double prob;
    
    /*genero un numero random tra 0 e 100*/
    prob = RANDOM(100);
    /*se il numero è minore di pc allora procedo con il crossover, altrmenti non faccio nulla*/
    if(prob < pc)
    {
        /*modifico i vettori*/
    }
    else
        printf("Crossover non applicato\n");/*non modifico nulla*/    
}
Ora, se assegno a pc il valore 0, quindi il crossover non viene mai applicato, dovrei ottenere che alla fine del ciclo, sulla matrice pool2 ho tutti i vettori di pool1 (magari cambiato di riga).
Invece no.
Dove sbaglio?

5 Risposte

  • Re: [C]integrità dati

    In mancanza del codice completo, confesso di non poterti aiutare.
    Prova a postare qualche dettaglio in più: dichiarazioni variabili del main e corpo della funzione RANDOM o la libreria nella quale si trova...
  • Re: [C]integrità dati

    Dichiarazioni variabili del main:
    
    int main()
    {
    
        int nodi,                 /*numero nodi del grafo*/
            i,j,k,z,              /*indici di scorrimento*/
            nodi_sottografo,      /*numero di nodi dei sottografi da considerare*/
            individui,            /*numero di individui da generare*/
            temp1, temp2,         /*variabili temporanee che aiutano la lettura da file*/ 
            cicli;                /*numero di cicli che il programma deve fare*/
        double pc;
    
        int* puntatore,           /*puntatore ad un nuovo individuo creato*/
             *ind1, *ind2;        /*puntatore a un individuo selezionato*/
             
        int **pool1, **pool2,     /*puntatori alle matrici che contengono gli individui*/
            **temp;               /*utile nello scambio di puntatori nei cicli*/
    
    
    Funzione RANDOM:
    
    /***************************************/
    /*Definizione delle costanti simboliche*/
    /***************************************/
    #define RANDOM(x) rand() % x
    #define RANDOMIZE srand((unsigned)time(NULL))
    
    Se serve altro chiedete pure!!!
  • Re: [C]integrità dati

    Vi pongo anche un'altra domanda, una cosa che non mi convince molto:
    Se io dichiaro un array nella main:
    
    int *array;
    array = (int *)malloc(sizeof(int) * dim);
    /*inizializzo il vettore a 0*/
    for(i=0;i<dim;i++)
        array[i] = 0;
    
    set(array, dim);
    
    E avessi una funzione set fatta più o meno così:
    
    void set(int *array, int dim)
    {
        int i;
    
        for(i=0;i<dim;i++)
        array[i] = 1;
    }
    
    Ora il valore di array sarebbe tutti 0 o tutti 1?
    La modifica che faccio io nella funzione è veramente effettiva?
  • Re: [C]integrità dati

    Tutti 1 ... ovviamente.
  • Re: [C]integrità dati

    Sto impazzendo...ho risolto! Grazie!
Devi accedere o registrarti per scrivere nel forum
5 risposte