Continui ad avere problemi con le dimensioni degli array, quando le passi come parametri di una funzione.
Allora:
double a => una variabile a di tipo double
double *a => un array a 1 dimensione di variabile double, lo usi cosi a[0], a[1]
double **a => un array a 2 dimensioni di variabili double, lo usi cosi a[0][0], a[0][1]
Come vedi nel prototipo l'hai passato a 2 dimensioni:
void scambia( double **a, int dim, int nrighe)
Poi invece lo usi come avesse solo 1 dimensione:
a[i+k]