Tôi đang cố chuyển một mảng từ C/C++ vào mô-đun Fortran 2003 và nhận các giá trị được tính toán trở lại C/C++. Tôi đã có thể vượt qua và trả lại các giá trị đơn (vô hướng) chỉ tốt, nhưng nhận được một mảng trở lại và chứng minh là khó khăn. Tôi đã tìm thấy nhiều chủ đề về các giá trị vô hướng và tôi đã thành công trong việc đưa ra những công việc đó.Vượt qua các mảng từ C/C++ đến Fortran và trả về một mảng được tính toán
Tôi đã lập mô hình các hàm dựa trên mảng của mình sau các hàm vô hướng làm việc của tôi.
Tôi đang sử dụng gcc/gfortran.
Đây là mô-đun Fortran (ConvertUnitsLib.f03).
module ConvertUnitsLib
use :: iso_c_binding ! for C/C++ interop
real(c_double), bind(c) :: degF, degC
public DegCtoF
contains
!
! Convert temperature degrees Celsius Fahrenheit
!
real(kind = c_double) function DegCtoF(degC) result(degF) &
& bind(c, name = "DegCtoF")
real(c_double), intent(in), dimension(:) :: degC
real(c_double), dimension(size(degC)) :: degF
do i = 1, size(degC)
degF(i) = (degC(i) * 1.8) + 32
end do
end function DegCtoF
! End of module
end module ConvertUnitsLib
Và C/C++, (CFort.cpp)
#include <stdio.h>
#ifdef __cplusplus
extern"C" {
#endif
double DegCtoF(double *[]);
#ifdef __cplusplus
}
#endif
/**********************************************************************/
int main(int argc, char *argv[])
{
printf("C/C++ and Fortran together!\n");
double DegreesC[2] = {32, 64};
double DegreesF[2];
DegreesF = DegCtoF(&DegreesC);
printf("%3.1f [C] = %3.1f [F]\n", DegreesC, DegreesF);
return 0;
}
Và cuối cùng nhưng không kém, Makefile
# C++ directives
CC=g++
CFLAGS=-std=c++11
# Fortran directives
FC=gfortran
FFLAGS=-std=f2003
all: clean
$(FC) $(FFLAGS) -c -fcheck=all ConvertUnitsLib.f03
$(CC) $(CFLAGS) -c CFort.cpp
$(FC) $(FFLAGS) ConvertUnitsLib.o CFort.o -o convert
clean:
rm -f *.o
rm -f *.mod
Vâng, tôi không chắc chắn về Fortran, nhưng trong C và C++, đi qua một mảng (thực sự chuyển địa chỉ của phần tử đầu tiên) mất tất cả thông tin kích thước, vì vậy thường lệ Fortran của bạn không biết gì về số lượng phần tử thực tế mảng chứa. Tôi sẽ mong đợi hai tham số, mảng (hoặc con trỏ đến bộ đệm), và số lượng các phần tử. – PaulMcKenzie
Từ thẻ của bạn, tôi cho rằng bạn đang sử dụng gfortran/gcc, nhưng bạn có thể xác nhận không? Thông qua một đối số hình dạng giả định, chẳng hạn như 'degC' không phải là một phần của khả năng tương tác Fortran 2003 C và đòi hỏi nhiều nỗ lực hơn nữa. Khía cạnh hiện được mong đợi là một phần của F2015 (ISO TS) không được hỗ trợ bởi gcc. Trong trường hợp không hỗ trợ như vậy, hãy sử dụng chú thích bằng @PaulMcKenzie và sử dụng một mảng hình dạng rõ ràng với kích thước cũng được chuyển. – francescalus
@francescalus, Vâng tôi đang sử dụng gfortran/gcc. Khi bạn có nghĩa là nỗ lực nhiều hơn, Tôi có cần phải vượt qua kích thước của mảng đó không? Tôi biết rằng khi C gọi hàm Fortran, nó sẽ chuyển các giá trị vô hướng bằng một con trỏ. Tôi chỉ cần phải vượt qua kích thước cũng có, và sau đó nó có thể (Fortran) con số phần còn lại ra? –