Смешайте C-строку и Фортран-строку в одном файле - PullRequest
2 голосов
/ 16 ноября 2010

У меня один вопрос со смешением C-строки и Fortran-строки в одном файле.

Предположим, я играю со строкой имени с фиксированной длиной 9, я определяю макрос длины как

#define NAME_LEN 9

в файле .c.

Существует существующая функция fortran, назовем ее fortran_function(char* name)

Теперь мне нужно вызвать эту функцию fortran в функции ac, назовем ее

c_function(char name[]) {

   fortran_function(name)

}

Теперь проблема в том, как мне объявить сигнатуру c_function?

c_function(char name[])
c_function(char name[NAME_LEN +1])

или

c_function(char name[NAME_LEN])

В каких ситуациях мне следует использовать 9 в качестве длины имени или 10?

Насколько я понимаю, до тех пор, пока вы передали нулевую строку с 9 символами в функцию c_, все объявления верны.Это правильно?

Любая другая проблема должна быть поставлена ​​здесь?Есть потенциальные ошибки?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2010

Здесь есть еще одна ошибка, если я правильно помню.Fortran не использует строки с нулевым символом в конце;вместо этого он дополняет правый конец буфера 0x20 (пробел).Таким образом, если у вас есть доступ к исходному коду Fortran, я бы изменил сигнатуру функции, чтобы в качестве аргумента принималась длина переданной строки.В противном случае вы, вероятно, столкнетесь с фортрановской стороной кода.

2 голосов
/ 16 ноября 2010

Дейв прав, стандартная концепция Fortran для струн фиксированной длины, дополненная пробелами справа. (У Fortran теперь также есть строки переменной длины, но они пока не распространены и было бы очень сложно взаимодействовать с C.) Если вы хотите, чтобы длины были фиксированными, то используйте тот же параметр NAME_LEN в вашем коде Fortran с тем же значением , Предложение Дейва о дополнительном аргументе длины, вероятно, лучше.

Дополнительным уточнением является использование средства привязки ISO C на стороне Фортрана (исправлено согласно комментарию!)

subroutine Fort_String_code (my_string), bind (C, name="Fort_String_code")
use iso_c_binding
integer, parameter :: NAME_LEN = 9
character (kind=c_char, len=1), dimension (NAME_LEN), intent (inout) :: my_string 

и т.д.. Имя «bind» - это имя, по которому C может вызывать подпрограмму Fortran - оно может отличаться от имени Fortran. В качестве части iso_c_binding также предоставляется символ C_NULL_CHAR, который можно использовать в коде Фортрана для предоставления завершающего нулевого символа, которого ожидает C и т. Д.

1 голос
/ 16 ноября 2010

Нет разницы для этих звонков.Компилятор c будет рассматривать их как char *.Вам просто нужно убедиться, что вы обнулили его, прежде чем использовать его в c.Если вы используете только строку со стороны фортрана и функции с просто удерживают ее, то вам не нужно ничего делать.

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