Tôi gặp sự cố khi truyền mảng char từ C++ đến fortran (f90).truyền mảng char từ C++ đến fortran
Đây là c của tôi ++ file, 'cmain.cxx':
Đây là tập tin fortran tôi, 'ftest.f90':
SUBROUTINE FTEST(string)
CHARACTER*3 string(2)
CHARACTER*3 expected(2)
data expected(1)/'abc'/
data expected(2)/'xyz'/
DO i=1,2
WRITE(6,10) i,string(i)
10 FORMAT("fortran: string(",i1,") = '", a, "'")
IF(string(i).eq.expected(i)) THEN
WRITE(6,20) string(i),expected(i)
20 FORMAT("'",a,"' equals '",a,"'")
ELSE
WRITE(6,30) string(i),expected(i)
30 FORMAT("'",a,"' does not equal '",a,"'")
END IF
ENDDO
RETURN
END
Quá trình xây dựng là:
gfortran -c -m64 ftest.f90
g++ -c cmain.cxx
gfortran -m64 -lstdc++ -gnofor_main -o test ftest.o cmain.o
Chỉnh sửa: lưu ý rằng tệp thi hành cũng có thể được tạo thông qua:
g++ -lgfortran -o test ftest.o cmain.o
Ngoài ra, cờ -m64 là bắt buộc khi tôi chạy OSX 10.6.
Kết quả từ thực hiện 'test' là:
c++: string[0] = 'abc'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' equals 'abc'
fortran: string(2) = 'xy'
'xy' does not equal 'xyz'
Tuyên bố 'string' và 'dự kiến' mảng nhân vật trong ftest.f90 với kích thước 4, ví dụ:
CHARACTER*4 string(2)
CHARACTER*4 expected(2)
và biên dịch lại cung cấp kết quả sau:
c++: string[0] = 'abc'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' does not equal 'abc '
fortran: string(2) = 'xyz'
'xyz' does not equal 'xyz '
Khai báo mảng ký tự trong 'cmain.cxx' với kích thước 3, ví dụ:
extern "C" int ftest_(char (*string)[3]);
int main() {
char string[2][3];
và quay trở lại kích thước ban đầu trong file fortran (3), ví dụ:
CHARACTER*3 string(2)
CHARACTER*3 expected(2)
và biên dịch lại cho kết quả như sau:
c++: string[0] = 'abcxyz'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' equals 'abc'
fortran: string(2) = 'xyz'
'xyz' equals 'xyz'
Vì vậy, trường hợp cuối cùng là chỉ có một mà làm việc, nhưng ở đây tôi đã chỉ định 3 ký tự cho một mảng char kích thước 3 có nghĩa là chấm dứt '\ 0' là mất tích, và dẫn đến đầu ra 'abcxyz' - điều này là không thể chấp nhận cho ứng dụng dự định của tôi.
Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều, điều này đang thúc đẩy tôi hạt!
Tôi không thấy dấu hiệu cho thấy bạn đang sử dụng các khả năng 'Khả năng tương tác với C' của Fortran được thiết kế để giảm bớt các vấn đề như bạn đang gặp phải. Tôi đề nghị bạn sử dụng chúng. –
Hi Mark, tôi có một chương trình fortran được cung cấp bên ngoài mà tôi muốn giao tiếp với thông qua C++. Tôi không thể sửa đổi mã fortran. Bạn có thể thấy một cách để làm việc này mà không sửa đổi tệp fortran gốc không? – user1334640
Nó phụ thuộc vào loại giao tiếp thực tế bạn đang làm, nhưng nếu bạn có mã Fortran, ngay cả khi bạn không thể thay đổi nó, bạn có thể thêm một mô-đun giao diện C vào nó. Mô-đun sẽ chỉ làm cho một số chức năng chuyển đổi hiển thị thành C. Là phần thưởng, bạn có thể loại bỏ dấu _ ở các tên hàm. –