Tôi đã phân bổ giá trị cho mảng trạng thái như sau:làm thế nào tôi có thể truy cập một con trỏ C từ fortran?
trạng thái [i] + = 1;
và tôi muốn truy cập mảng này từ fortran
làm cách nào tôi có thể truy cập vào mảng này?
ví dụ tôi muốn thay đổi giá trị của STAT từ fortran như thế này:
STAT (2) = 3
có thể như vậy?
nguồn c
#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]);
}
}
nguồn 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
tôi đã được thử nghiệm mã này và tôi giới thiệu đến câu trả lời tốt cho câu hỏi này. nhưng tôi gặp lỗi khi phân đoạn khi cố gắng thực hiện như sau:
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
bạn có thể nhận ra vấn đề là gì không?
+1: nhưng tôi đã có vào giai đoạn mà tôi nghĩ rằng giúp đỡ mọi người để viết FORTRAN77 những ngày này là phi đạo đức; Tôi sẽ giúp họ viết lại nó nhưng không có lý do chính đáng để viết mã mới trong FORTRAN77. –
Tốt hơn hãy bật khối giao diện cho thường trình trong đó. OP cũng nên thay thế 'INTEGER * 8' không chuẩn với' INTEGER (C_INT) ', nếu không có khả năng là một kích thước nguyên không khớp trên nhiều hệ thống hiện tại. – IanH
Bạn chắc chắn đúng với loại số nguyên, không tương thích. –