2012-04-24 42 views
6

Tôi muốn có thể gọi các chức năng mạng trong ứng dụng Fortran của mình. Ông chủ của tôi muốn tôi làm mọi thứ ở Fortran thay vì sử dụng C và Fortran. Chúng tôi đã thực hiện một phiên bản của ứng dụng bằng trình biên dịch Fortran của PGI trên Windows. Chúng tôi đang chuyển nó sang Linux, nơi chúng tôi có thể sử dụng trình biên dịch của họ. Ngay bây giờ, tôi đang sử dụng gfortran.ổ cắm lập trình gfortran

Tôi đã tạo giao diện cho các cuộc gọi mạng này và mọi thứ biên dịch và liên kết. Mã dưới đây là một cái gì đó tương tự như những gì tôi đang làm ngoại trừ các giao diện và hằng số là trong một mô-đun.

PROGRAM MAIN 

    INTEGER,PARAMETER ::AF_INET = 2 
    INTEGER,PARAMETER ::SOCK_STREAM = 1 
    INTEGER,PARAMETER ::IPPROTO_TCP = 6 

    INTERFACE 
     FUNCTION socket(domain,type,protocol) 
     INTEGER ::socket,domain,type,protocol 
     END FUNCTION 
    END INTERFACE 

    sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) 
    WRTIE(*,*)"Socket returned: ",sock 

END PROGRAM 

Khi tôi chạy chương trình, chức năng socket không trả về -1. Tôi thực sự không biết chuyện gì đang diễn ra. Tôi không thêm bất kỳ thư viện trên dòng lệnh vì vậy tôi đoán nó là liên kết với các thư viện mặc định một cách chính xác. Tôi biên dịch bằng cách sử dụng

gfortran -o MAIN_PROGRAM MAIN_PROGRAM.f90 -fno-underscoring 
+0

Bạn đã cố gắng để kiểm tra errno? –

Trả lời

8

Bạn có thể sử dụng ISO_C_Binding được giới thiệu trong Fortran 2003 để truy cập chức năng thư viện C, đây là tùy chọn sạch và dễ di động nhất mà bạn có. Các Gfortran documentation có một số chi tiết về nó, như bất kỳ hướng dẫn nhà cung cấp khác. Ngoài ra còn có một số dự án nhằm triển khai các giao diện cho POSIX cho Fortran 90: fortranposixposix90. Nhưng như tôi đã nói một giao diện C-Binding thích hợp sử dụng khả năng F2003 có lẽ là lựa chọn sạch nhất, xem thêm fortranwiki.

Edit: Dưới đây là mã của bạn với keo ISO-C-Ràng buộc thêm vào (thử nghiệm với gfortran 4.4.5):

program testsocket 
    use, intrinsic :: iso_c_binding 

    implicit none 

    interface 
    function socket(domain, type, protocol) bind(c, name="socket") 
     use, intrinsic :: iso_c_binding 
     integer(kind=c_int) :: socket 
     integer(kind=c_int), value :: domain, type, protocol 
    end function socket 
    end interface 

    integer :: sock 

    sock = socket(2_c_int, 1_c_int, 6_c_int) 

    write(*,*) "Socket returned: ", sock 

end program testsocket 
+1

Ah! Tôi thấy vấn đề của tôi. Tôi đang đi qua các đối số bằng cách sử dụng cuộc gọi bằng cách tham khảo để socket() không được gọi là với các tùy chọn hợp lệ. Cảm ơn! – hw12

0

Đây là phỏng đoán. Bạn là sinh viên sau đại học về khoa học hoặc kỹ thuật (nhưng không phải khoa học máy tính hay kỹ thuật máy tính) và sếp của bạn được sinh ra trước năm 1950. Nếu vậy, tôi đã đứng trong đôi giày của bạn (ngoại trừ trường hợp của tôi yêu cầu sử dụng Fortran 77) . Tôi cảm nhận được nỗi đau của bạn.

Như bạn có thể đã biết, Fortran không sử dụng tệp tiêu đề cho các cuộc gọi hàm nguyên mẫu giống như cách C thực hiện. Bạn có thể gọi một hàm Fortran không có tiêu đề, khi các loại đối số không được chọn.

Tuy nhiên, có sự cố này - hoặc đã từng là sự cố này, vì trải nghiệm gần đây nhất của tôi là vài năm lỗi thời. So với C, GNU Fortran thêm một dấu gạch dưới ẩn vào tên của mỗi hàm. Nó cũng thấp hơn trường hợp tên hàm.

Chương trình readelf -a có thể giúp bạn tại đây. Sử dụng nó trên tệp đối tượng trình biên dịch Fortran của bạn phát ra. Tìm đầu ra cho biểu tượng socket. Nếu hồi ức của tôi là đúng, bạn sẽ thấy một số _socket trong đó.

Nếu bạn thực sự, thực sự không thể sử dụng bất kỳ C nào cả - ngay cả khi thực hiện chức năng bao bọc với tên C _socket() - thì tôi thừa nhận rằng tôi không biết bạn nên làm gì tiếp theo. Trong trường hợp đó, bạn có thể bị kẹt ở một chỗ chật hẹp. Dù bằng cách nào, chúc may mắn.

Cập nhật: Tôi khuyên bạn nên comment @ M.S.B. dưới đây.

+6

Bạn có thể kiểm soát việc đặt tên các chức năng với Ràng buộc ISO C được mô tả bởi haraldki và tránh các dấu gạch dưới. Việc trộn Fortran và C dễ dàng hơn và dễ di chuyển hơn trước đây. –

+3

Tôi sinh 1982 và Ise Fortran cho các dự án mới. Tôi thậm chí đã dịch rất nhiều mã từ C. Tôi có điều gì xấu với tôi? –

+0

@VladimirF: Không, không có gì xấu, tất nhiên.Fortran là một công cụ để thực hiện một công việc và bạn đang sử dụng nó để thực hiện công việc. Tốt cho bạn. Nếu bạn muốn biết, kinh nghiệm của tôi là ngược lại. Tôi đã được yêu cầu sử dụng Fortran 77 (thậm chí không Fortran hiện đại) cho các mục đích mà C hoặc thậm chí Perl là phù hợp hơn. Tôi không bận tâm. Tôi đã được trả tiền, và tôi chưa bao giờ tranh cãi với ông chủ của tôi về nó; nhưng, nếu bạn hỏi tôi liệu tôi có nghĩ rằng ông chủ của tôi đã lựa chọn đúng trong trường hợp này, tôi sẽ nói rằng tôi không nghĩ vậy. Đối với bạn: đi Fortran! – thb