Primero, estás utilizando nca y nfa (que, supongo, se refieren a número de columnas y de filas) sin haberles asignado valor alguno, por lo que tomarán valores aleatorios.
Segundo, para lo que estás empleando estas variables es para reservar memoria de forma dinámica. Aunque el compilador haga la conversión correspondiente, debido a que los valores que hayan tomado son aleatorios, puede que sean valores no válidos para una reserva de memoria.
Tercero, estás utilizando variables de tipo double como variables de control para bucles e índices para los elementos de la matriz. No es ilegal, pero tampoco conveniente. Para esto, utiliza valores int o unsigned int.
Cuarto, estás devolviendo un doble puntero a double en una función que has declarado como que retorna un double.
Para transponer una matriz, sería más sencillo así:
Código C++:
Ver originalvoid Trans1(double **A, unsigned filas, unsigned cols)
{
double x;
for (int i=0; i<filas; i++)
for (int j=0; j<columnas; j++)
{
x = A[i][j];
A[i][j] = A[j][i];
A[j][i] = x;
}
Esta te sobreescribe la matriz de entrada. Si necesitas conservar la matriz de entrada, tendrás que pasar también la matriz de salida:
Código C++:
Ver originalvoid Trans2(double **A, double **B, unsigned filas, unsigned cols)
{
for (int i=0; i<filas; i++)
for (int j=0; j<columnas; j++)
B[i][j] = A[j][i];
}
Claro está, suponiendo que las matrices A y B han sido convenientemente creadas antes de llamar a la función.