C, Fortran, двумерный массив (gcc)

Модератор: Модераторы разделов

gtn-gagarin
Сообщения: 95
ОС: Linux

C, Fortran, двумерный массив

Сообщение gtn-gagarin »

В общем имеется такая функция на фортране.

Код: Выделить всё

      SUBROUTINE DECOMP(NDIM,N,A,COND,IPVT,WORK)
C
      INTEGER NDIM,N
      REAL A(NDIM,N),COND,WORK(N)
      INTEGER IPVT(N)
C   Дальше собственно функция

      END

Как видно, A - двумерный массив.
Как правильно объявить прототип функции на C и в каком виде нужно передавать ей массив из функции на C? (вся сложность для меня заключается в двумерном массиве, остальные переменные и одномерный массив я передать могу, собрать программу могу)
Спасибо сказали:
ester
Сообщения: 45

Re: C, Fortran, двумерный массив

Сообщение ester »

gtn-gagarin писал(а):
18.04.2009 16:19
В общем имеется такая функция на фортране.

Код: Выделить всё

      SUBROUTINE DECOMP(NDIM,N,A,COND,IPVT,WORK)
C
      INTEGER NDIM,N
      REAL A(NDIM,N),COND,WORK(N)
      INTEGER IPVT(N)
C   Дальше собственно функция

      END

Как видно, A - двумерный массив.
Как правильно объявить прототип функции на C и в каком виде нужно передавать ей массив из функции на C? (вся сложность для меня заключается в двумерном массиве, остальные переменные и одномерный массив я передать могу, собрать программу могу)

Двумерный массив , надо полагать, следует передавать просто как указатель на вещественное число соответствующей разрядности.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C, Fortran, двумерный массив

Сообщение drBatty »

gtn-gagarin писал(а):
18.04.2009 16:19
Как видно, A - двумерный массив.

а в Си нет двухмерных массивов.
есть массивы массивов, есть массивы указателей на другие массивы, но того, что вам надо просто нет.

Код: Выделить всё

int A[10][20];

это вовсе не двухмерный массив, это одномерный массив, который имеет 10 элементов, причём каждый элемент - это массив из 20 целых чисел. при объявлении массива и при передачи в функцию, нужно указать, тип эл-тов массива. В данном случае функция будет такая:
int DECOMP(int NDIM, int N, float A[][20], float COND, int IPVT[], float WORK)
{return 0;}

т.е. мы передаём одномерный массив из нескольких float[20]. причём сколько их функция не узнает, кроме того элементы всегда будут именно по 20 штук. Если вам это не нравится, используйте массивы указателей, там можно всё, и не только передавать такой массив в функцию(указатель на указатель), но и делать например трёхугольные массивы.

Да. вы размерности в функцию передаёте, потому массив вам нужен динамический, типа float **A, т.е. не один массив, а NDIM массивов, каждый по N эл-тов типа float, и ещё один массив размером в NDIM из указателей на эти массивы.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
gtn-gagarin
Сообщения: 95
ОС: Linux

Re: C, Fortran, двумерный массив

Сообщение gtn-gagarin »

В общем мне уже подсказали.
Тут вот такие моменты:
1) Функция на фортране в качестве параметров принимает только указатели (нельзя ни значения, ни указатели на указатели, так что массив указателей не подойдёт)
2) Перед передачей массив нужно транспонировать

Всем спасибо за участие!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C, Fortran, двумерный массив

Сообщение drBatty »

gtn-gagarin писал(а):
19.04.2009 15:38
1) Функция на фортране в качестве параметров принимает только указатели (нельзя ни значения, ни указатели на указатели, так что массив указателей не подойдёт)
2) Перед передачей массив нужно транспонировать

ну я не знаю... вы же хотели массив на Си? причём тут фортран?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
gtn-gagarin
Сообщения: 95
ОС: Linux

Re: C, Fortran, двумерный массив

Сообщение gtn-gagarin »

drBatty писал(а):
19.04.2009 16:27
ну я не знаю... вы же хотели массив на Си? причём тут фортран?

Нужен был такой массив на Си, чтобы его поняла функция на фортране (DECOMP) как двумерный.
То есть DECOMP написанный на фортране вызывается из Си, я не собирался его переписывать на Си
Спасибо сказали: