сокеты — FORTRAN для C ++ и C ++ для FORTRAN

У меня есть приложение C ++ и приложение FORTRAN, которые общаются через файл. (Оба направления)

Приложение FORTRAN записывает данные в файл, а C ++ читает данные из файла.
Теперь появилось новое требование, согласно которому я должен напрямую общаться (поскольку файловые операции стоят дорого) с C ++ в форме кода FORTRAN и с FORTRAN на C ++.
Я реализовал сокет на стороне C ++ и попытался реализовать сокет на стороне FORTRAN. я
недостаточно информации в интернете о сокетах на Фортране.

Унаследованный код FORTRAN написан в g77.
C ++ находится в MFC.

  1. Есть ли лучший подход для достижения этого, кроме сокета
    связь?
  2. Любые ссылки о сокетах на FORTRAN с использованием g77 будут полезны.

Я знаю, я не должен просить ссылки на этом форуме. Если этот вопрос не относится к этому форуму, где я могу задать такой вопрос?

2

Решение

Если связь только односторонняя, вы можете использовать именованные каналы или даже анонимный канал.

Как и во всех межпроцессных коммуникациях, есть несколько ошибок.

Лучше всего использовать неформатированный поток. Это относительно новая функция, представленная в Fortran 2003, но ее поддерживают все основные компиляторы. Итак, откройте ваш файл с

  OPEN(20,file="myfifo",access="stream",form="unformatted",status="old",action="write")

и написать ему, используя такие выражения, как

    WRITE (20) A

Почему неформатный поток?

Во-первых, не отформатированный: вы написали, что скорость имеет значение в вашем случае. Преобразование чисел в десятичное и обратно стоит много циклов ЦП, а также может привести к потере точности.

Во-вторых, поток: обычная реализация неформатированного ввода-вывода с Fortran использует маркеры записи — маркер перед записью, показывающий, как долго эта запись, маркер позади записи, показывающий ту же информацию.

Как система времени выполнения знает, как долго будет записываться запись? Ну, это не так. Таким образом, общая реализация состоит в том, чтобы написать фиктивный маркер записи, записать запись (и узнать, как долго она будет), написать конечный маркер, выполнить поиск первого маркера, перезаписать фиктивный маркер записи и продолжить. Это не работает для именованного канала — вы не можете искать там. Вам может повезти, если вы все еще находитесь в буфере, но вы не можете зависеть от этого.

Относительно компилятора: если проблема совместимости со старым кодом g77, используйте gfortran. Поддерживает ACCESS="STREAM" и имеет большинство расширений от g77. g77 старый и не поддерживается уже несколько лет.

0

Другие решения


По вопросам рекламы [email protected]