मैंने इस तरह की स्थिति सरणी के लिए मूल्य आवंटित किया:मैं फोर्टन से सी पॉइंटर तक कैसे पहुंच सकता हूं?
स्थिति [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
आप पहचान सकते हैं क्या बात है: लेकिन मैं एक विभाजन गलती त्रुटि जब मैं इस तरह करने की कोशिश की है?
+1: लेकिन मैं चरण के लिए मिल गया है मैं कहाँ लगता है कि लोगों की मदद करने फ़ोरट्रॉन 77 इन दिनों लिखने के लिए अनैतिक है; मैं उन्हें फिर से लिखने में मदद करूंगा लेकिन FORTRAN77 में नया कोड लिखने के कोई अच्छे कारण नहीं हैं। –
वहां भी नियमित रूप से एक इंटरफ़ेस ब्लॉक को पॉप करें। ओपी को 'INTEGER (C_INT)' के साथ गैर-मानक 'INTEGER * 8' को भी प्रतिस्थापित करना चाहिए, अन्यथा कई मौजूदा सिस्टम पर एक पूर्णांक आकार विसंगति होने की संभावना है। – IanH
आप निश्चित रूप से पूर्णांक प्रकार के साथ सही हैं, जो असंगत है। –