Массивы не совпадают с указателями. Тип long long (*)[2]
является указателем на массив из 2 long long
с. Тип long long **
является указателем на указатель на long long
. Два типа несовместимы.
Чтобы объявить что-то типа long long (*)[2]
, что-то идет между *
и )
. Например, простая переменная foo
типа long long (*)[2]
будет объявлена как long long (*foo)[2];
. Для функции, возвращающей long long (*)[2]
, это имя функции и список ее параметров находятся между *
и )
. Например, функция bar
, принимающая один параметр int a
и возвращающая long long (*)[2]
, будет объявлена как long long (*bar(int a))[2];
.
. Из вопроса следует, что функция convertFrac
должна скопируйте массив дробей (каждая дробь представлена long long [2]
) и преобразуйте их, чтобы использовать общий знаменатель. Следующий код выполняет большую часть этого, кроме вычисления общего знаменателя:
long long lcm(long long a, long long b); // to be written
long long (*convertFrac(long long lst[][2], int row))[2] {
long long (*result)[2] = malloc(row*sizeof(*result));
long long d;
int i;
// determine common denominator
d = 1;
for (i = 0; i < row; i++) {
d = lcm(d, lst[i][1];
}
// convert fractions to common denominator
for (i = 0; i < row; i++) {
result[i][0] = lst[i][0] * (d / lst[i][1]);
result[i][1] = d;
}
return result;
}
Подходящий typedef
для типа дроби сделает код более читабельным:
typedef long long fraction[2];
fraction *convertFrac(fraction lst[], int row) {
fraction *result = malloc(row*sizeof(*result));
...
return result;
}