Функция 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 должен быть пустым. Однако вы с большей вероятностью избежите ошибок, не используя функции возврата символьных строк. Используйте подпрограммы или помещайте строки в модули или глобальные переменные, когда это возможно.