Zacznijmy od tego, że coś takiego:
cin >> n;
float tm[n][n];
jest niezgodne ze standardem i tylko częśc kompilatorów idzie na ręke i na to pozwala: https://forum.pasja-informatyki.pl/384088/tablica-statyczna-a-dynamiczna?show=384088#q384088
Jak już zmienisz sposob tworzenia tablicy to przy okazji rozwiaze sie problem przekazania do funkcji, bo obecna funkcja zadziała :P
Gdybyś mimo wszystko chciał przekazać tablice alokowaną statycznie to w sygnaturze funkcji musisz podać jej zewnetrzny rozmiar tzn:
void tworzenie(float a[][5], int n)
Jest to konieczne ze względu na to, że kompilator zamienia taką deklaracje:
void tworzenie(float a[][], int n)
na taką:
void tworzenie(float **a, int n)
A tablica statyczna 2d nie moze byc skonwertowana do podwójnego wskaźnika tylko do (*)[5] - wskaźnika na tablice o dlugosci 5, gdzie 5 ro zewnetrzny rozmiar tablicy (dlugosc wiersza)