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

Подпрограмма OpenVMS (VAX) FORTRAN может быть передана в 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);
}

Как работает функция OpenVMS (VAX) FORTRAN, которая возвращает 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);
}
  • ОпенВМС версии 6.2
  • Цифровой Фортран 77 V6.5-188
  • Декабрь C V6.0-001

person CW Holeman II    schedule 17.12.2014    source источник
comment
характерные*(*) функции - очень малоизвестная особенность старого Фортрана. Я не думаю, что вы можете легко связать его с C.   -  person Vladimir F    schedule 17.12.2014


Ответы (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);
}
person user2116290    schedule 17.12.2014

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

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

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

person Fran    schedule 17.12.2014
comment
Я добавил информацию о версии в вопрос. - person CW Holeman II; 17.12.2014