Совместимость Fortran и C: получить возвращаемое значение от c (вызов из Fortran) - PullRequest
0 голосов
/ 30 января 2019

Я прочитал много постов на похожую тему, но мне пока не удалось решить эту проблему.Я должен отметить, что я значительно упростил свой код для этого поста.Я собираюсь использовать функцию ac, вызывая ее из fortran77 и получая обратно значения от c.Тот факт, что я упоминаю fortran77, связан с тем, что я хочу связать свой код с гораздо более крупным проектом, использующим fortran77, но я готов рассмотреть решения с другими версиями fortran, если они выполнят свою работу и если вы считаете, что они упростят мою проблему.

У меня есть два файла: Try_stack.f и client2.c.Я компилирую свой код как:

gcc -c client2.c
gfortran -g Try_stack.f client2.o -o combined

Мой файл Try_stack.f:

      program circle

      call circle2
      stop
      end

      subroutine circle2 
      dimension rread(2)
      double precision r, area,rread
      external client

      area = 3.
      rread(1)=area
      rread(2)=area+10.
      write (*,*) 'Area = ',  rread(1)
      call client(rread)
      retNread = rread(1) * 2
      write(*,*) 'new nread is: ',retNread

      return
      end

И мой файл client2.c:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdint.h>

int client_(double rread[2]) 
{ 
    double result;
    result=1.;
    rread[1]=result;
    printf("%.2lf",rread);
    return 0; 
} 

После запускаскомпилированная версия, которую я получаю:

Area = 3.0000000000000000
0,00 новый nread: 6.00000000

Но я хотел, чтобы возвращаемое значение для программы на языке fortran было равно 8.000 вместо 6.0000(потому что fortran отправляет значение 3., 1. добавляется к 3. и 4.0 должно вернуться обратно в fortran для умножения его на 2.).Если бы я хотел написать это простым способом, чтобы объяснить это, я бы сказал:

  • Во-первых, я хочу, чтобы файл fortran отправил номер 3. в c (на самом деле я хочу обменятьсямассивы).

  • Во-вторых, я хочу, чтобы файл c взял номер 3. и добавил 1.

  • В-третьих, я хочу, чтобы c вернулвернуть результат в файл fortran, то есть число 4.

  • Наконец, я хочу, чтобы fortran продолжил вычисления, в этом случае умножьте 4 * 2 = 8.

Iмного читал о iso_c_binding, но мне явно не удалось его использовать, плюс для этого требуются последние версии Fortran, если я правильно понимаю.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 01 февраля 2019

Есть много комментариев, кто-нибудь на самом деле компилировал и пытался запустить этот код?Помимо FORTRAN (индекс начала формы 1) и C (индекс начинается с 0), есть опечатка, препятствующая получению ожидаемого результата.

Кстати, пожалуйста, используйте неявный none в любом FORTRAN!

int client_(double rread[2]) 
{ 
    double result;
    result=1.;
    //rread[1]=result; --> typo?
    rread[0]+=result;
    printf("%.2lf",rread);
    return 0; 
} 

Area = 3.0000000000000000
0.00 Новый Nread: 8.0000000000000000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...