2012-12-06 30 views
5

मैंने इस तरह की स्थिति सरणी के लिए मूल्य आवंटित किया:मैं फोर्टन से सी पॉइंटर तक कैसे पहुंच सकता हूं?

स्थिति [i] + = 1;

और मैं fortran
कैसे मैं इस सरणी के लिए उपयोग कर सकते हैं से इस सरणी को एक्सेस करना चाहते?
उदाहरण के लिए मैं इस तरह fortran से STAT का मूल्य बदलना चाहते हैं:

STAT (2) = 3

संभव है?

ग स्रोत

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 

void call_fc_ (int *key, int *addr, int *size, int *status) 
{ 
    int i; 
    int shmid; 
    void* shared_addr; 

    //printf("first ptr = %p\n", *addr); 

    shmid = shmget (*key, *size, IPC_CREAT | IPC_EXCL | 0666); 
    if (shmid == -1) 
    { 
     printf("shmget is failed!\n"); 
     exit(0); 
    } 
    shared_addr = (void*) shmat(shmid, 0, 0); 
    status = (int*)shared_addr; 
    //printf("status ptr = %p\n", status); 

    int data_size = *size/sizeof(int); 

    for(i=0; i<data_size;i++) { 
     status[i] += 1; 
     printf("%d th value : %d \n", i, status[i]); 
    } 
} 

fortran स्रोत

IMPLICIT NONE 
INTEGER*8 KEY,SIZE,ADDR 
DATA KEY/777/
DATA SIZE/64/
!DATA ADDR/Z'b76fb000'/

CALL CALL_FC(KEY, ADDR, SIZE, STAT) 

PRINT *, 'stat is : ', STAT 

! CAN I ACCESS TO STAT LIKE THIS? 
!DO I=1,10 
!STAT(I) = STAT(I) + 5 
!WRITE (*,*) STAT(I) 
!END DO 

मैं इस कोड परीक्षण किया गया है और मैं इस सवाल का अच्छा जवाब में संदर्भित।

integer(c_int) :: key = 777, ssize = 64, addr 
integer, pointer, dimension(:) :: stat 
type(c_ptr) :: statptr 

!DATA KEY/777/
!DATA SIZE/64/


print *, 'before stat size = ', size(stat) 
call call_fc(key, addr, ssize, statptr) 
!print *, 'statptr = ', statptr 
call c_f_pointer(statptr, stat, [ssize]) 
print *, 'after stat size = ', size(stat) 

stat(1) = 111 <== 
stat(2) = 222 
stat(3) = 333 

print *, 'stat : ', stat 

आप पहचान सकते हैं क्या बात है: लेकिन मैं एक विभाजन गलती त्रुटि जब मैं इस तरह करने की कोशिश की है?

उत्तर

7

आपको किसी भी तरह से स्टेटस घोषित करना होगा। यदि आप गतिशील स्मृति आवंटन के साथ खेलना शुरू करते हैं, तो फ़ोरट्रान 77 में रहना निराशाजनक है। हो सकता है कि कोई आईडी कुछ समाधान के साथ आने में सक्षम हो, लेकिन यह संभवतः मुझे मिला सबसे छोटा बदलाव है। यह सी (हो सकता है कि क्रे सूचक समाधान कम होगा, लेकिन गैर मानक) के साथ फोरट्रान 2003 अंतर

USE ISO_C_BINDING 

IMPLICIT NONE 


INTEGER(C_INT) KEY,SIZE,ADDR,I 
DATA KEY/777/
DATA SIZE/64/
!DATA ADDR/Z'b76fb000'/
INTEGER,POINTER :: STAT(:) 
TYPE(C_PTR) :: STATPTR 

CALL CALL_FC(KEY, ADDR, SIZE, STATPTR) 

call C_F_POINTER(STATPTR,STAT,(/SIZE/)) 

PRINT *, 'stat is : ' 
DO I=1,SIZE 
    PRINT *,STAT(I) 
END DO 

! CAN I ACCESS TO STAT LIKE THIS? 
!DO I=1,10 
!STAT(I) = STAT(I) + 5 
!WRITE (*,*) STAT(I) 
!END DO 
END 

मैं अपनी सी हिस्सा है, जो मैं जांच नहीं से कुछ त्रुटि हो रही है उपयोग करता है। मैं भी बिल्कुल नहीं जानता, कार्यक्रम क्या करना है।

हालांकि मैं वास्तव में आपको आधुनिक फोरट्रान सुविधाओं का उपयोग करने के लिए प्रोत्साहित करता हूं। सी और फोरट्रान के बीच अंतःक्रियाशीलता के लिए ISO_C_BINDING सबसे महत्वपूर्ण है। DATA कथन भी भूल जाएं और परिवर्तनीय प्रारंभिकरण का उपयोग करें।

एक और अधिक आधुनिक फोरट्रान त्वरित अनुवाद:

use iso_c_binding 

    implicit none 

    interface 
    subroutine call_fc(key,addr,size,status) bind(C,name='call_fc_') 
     import 
     integer(c_int) :: key !intents should be added 
     integer(c_int) :: addr 
     integer(c_int) :: size 
     type(c_ptr) :: status 
    end subroutine 
    end interface 



    integer(c_int) :: key = 777, size=64,addr,i 
    integer(c_int),pointer :: stat(:) 
    type(C_ptr) :: statptr 

    call call_fc(key, addr, size, statptr) 

    call c_f_pointer(statptr,stat,(/size/)) 

    print *, 'stat is : ',stat 

end 
+4

+1: लेकिन मैं चरण के लिए मिल गया है मैं कहाँ लगता है कि लोगों की मदद करने फ़ोरट्रॉन 77 इन दिनों लिखने के लिए अनैतिक है; मैं उन्हें फिर से लिखने में मदद करूंगा लेकिन FORTRAN77 में नया कोड लिखने के कोई अच्छे कारण नहीं हैं। –

+1

वहां भी नियमित रूप से एक इंटरफ़ेस ब्लॉक को पॉप करें। ओपी को 'INTEGER (C_INT)' के साथ गैर-मानक 'INTEGER * 8' को भी प्रतिस्थापित करना चाहिए, अन्यथा कई मौजूदा सिस्टम पर एक पूर्णांक आकार विसंगति होने की संभावना है। – IanH

+0

आप निश्चित रूप से पूर्णांक प्रकार के साथ सही हैं, जो असंगत है। –