Функция OpenVMS (VAX) Fortran, возвращающая символ *(*) в C

Подпрограмма ФОРТРАН OpenVMS (VAX) может быть передана character*(*):

subroutine forsub (in)
character*(*) in
type *, in
return
end

из функции C:

#include<stdio.h>
#include <descrip.h>
extern void forsub();
main()
{
    auto $DESCRIPTOR(in_string, "VMS pass from c to fortran.");
    forsub(&in_string);
}

Какова функция FORVAN OpenVMS (VAX), которая возвращает character*(*):

character*(*) function forfunc (in)
character*(*) in
forfunc = in
return
end

обрабатывается в коде C:

#include<stdio.h>
#include <descrip.h>
extern ?????? forfunc();
main()
{
    auto $DESCRIPTOR(in_string, "VMS fortran function return to c.");
    ??????? = forfunc(&in_string);
}
  • OpenVMS V6.2
  • Цифровой Фортран 77 V6.5-188
  • DEC C V6.0-001

2 ответа

Решение

Пример 3-5 в этом (старом?) Руководстве пользователя C, вероятно, объясняет, как это сделать: вам нужен уже упомянутый скрытый аргумент. Примером может быть:

#include <stdio.h>
#include <descrip.h>
extern void forfunc();
main()
{
    auto $DESCRIPTOR(in_string, "VMS fortran function return to c.");
    char buffer[64];
    struct dsc$descriptor_s out_string = {
        sizeof buffer, DSC$K_DTYPE_T, DSC$K_CLASS_S, buffer};
    forfunc (&out_string, &in_string);
    printf ("%.*s\n", out_string.dsc$w_length, out_string.dsc$a_pointer);
}

Из справки DIGITAL Visual Fortran Version V6.0A:

Функции Fortran, которые возвращают символьную строку с использованием синтаксиса CHARACTER*(*), помещают скрытый строковый аргумент и адрес строки в начале списка аргументов.

Функции Си, которые реализуют такой вызов функции Фортрана, должны явно объявить этот скрытый строковый аргумент и использовать его для возврата значения. Возвращаемый тип C должен быть пустым. Однако вы с большей вероятностью избежите ошибок, не используя функции возврата символьных строк. Используйте подпрограммы или помещайте строки в модули или глобальные переменные, когда это возможно.

Другие вопросы по тегам