Pergunta

Basicamente, aqui está o meu problema. Estou chamando as funções fortran de outra pessoa do meu código C ++, e isso está me dando dores de cabeça. Algum código:

function c_error_message()
character(len = 255) :: c_error_message
errmsg(1:9) = 'ERROR MSG'
return
end

Essa é a função fortran. Minha primeira pergunta é: existe algo que causaria um segfault?

Caso contrário, então segundo: o que isso retorna? Um ponteiro? Estou tentando chamá -lo com a seguinte declaração C:

char *e = c_error_message_();

Isso causa um segfault.

c_error_message();

Isso também causa um segfault.

Eu declarei c_error_message_ () anteriormente com o seguinte código:

extern"C" {
    char* c_error_message_();
}

Declarar uma função com um tipo de retorno diferente do tipo de retorno real causaria um segfault?

Estou perdido. Obrigado por quaisquer respostas.

Foi útil?

Solução

Aqui está um método que funciona. Quando tentei usar a ligação ISO C com uma função retornando uma string, o compilador se opôs. Portanto, se você usa um argumento de sub -rotina:

subroutine fort_err_message (c_error_message) bind (C, name="fort_err_message")

use iso_c_binding, only: C_CHAR, C_NULL_CHAR

character (len=1, kind=C_CHAR), dimension (255), intent (out) :: c_error_message

character (len=255, kind=C_CHAR) :: string
integer :: i

string = 'ERROR MSG' // C_NULL_CHAR

do i=1, 255
   c_error_message (i) = string (i:i)
end do

return

end subroutine fort_err_message

O Fortran é um pouco estranho, porque tecnicamente uma corda C é uma matriz 1D de caracteres.

E Código do Exemplo C para demonstrar que isso funciona:

#include <stdio.h>

void fort_err_message ( char chars [255] );

int main ( void ) {

  char chars [255];

  fort_err_message ( chars );

  printf ( "%s\n", chars );

  return 0;

}

Outras dicas

Como a segunda linha declara um nome que é o mesmo que o nome da função, está declarando o tipo de retorno da função, a saber, uma string de caractere scaler de 255 caracteres. Mas, em teoria, isso não nos diz a API interna - esse é o compilador. Não sei de onde vem "Errmsg" - ele deve ser declarado em outro lugar - talvez uma variável global, conforme sugerido por Michael Anderson. Ou talvez seja um erro e a linha deve ser c_error_message = "error msg". (Não há necessidade de designar a faixa de sub-string-o restante da string será preenchido com espaços em branco.) IMO, a melhor abordagem para chamar o Fortran de C (ou vice-a-versa) é usar a ISO C A ligação, que fará com que o compilador fortran use uma interface compatível com C. Eu não fiz uma função retornando uma string, mas fiz strings como argumentos.

Funções fortran retornam o valor atribuído ao nome da função. O tipo retornado é especificado pela definição da função e, neste caso, está retornando uma string de caracteres 255 caracteres. Eu acho que a incompatibilidade do tipo é por que você é uma seleção. Então, qual tipo C você deve usar? Não sei.

Eu achei isto Usando C com fortran Page, e o autor recomenda fortemente o uso de subtutinas fortran e chamando -as de funções C devolvendo o tipo de vazio.

Aqui está um F95 Referência rápida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top