- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
I use a third-party application which permits access to a user-writtenroutine via a DDE interface. The DDE interface is managed by a client program written in C++. I have access to the code. This client program assumes that the userroutine is written in C++, but since FORTRAN is my language, I want the client program to access a FORTRAN function. WIthin the client program code, the reference to the user function is thus:
void UserFunction(char *szCommandLine);
The argument is defined as a 260-character string variable. What I would be glad to know is what whould this definition statement be changed to in the C-codeand what matching compiler directive I should use in my FORTRAN version of USERFUNCTION? For the latter, I have in mind
SUBROUTINE USERFUNCTION( STRING)
!DEC$ ATTRIBUTES REFERENCE, C :: USERFUNCTION
!DEC$ ATTRIBUTES REFERENCE, C :: USERFUNCTION
CHARACTER*(*)STRING
I have a C++ compiler, so I envisage compiling the C-code (which contains the WINMAIN)seperately into an .OBJ file and includingthe .OBJ fileinto a FORTRAN project consisting of my USERFUNCTION and creating an executable from it. ANy other tips would be appreciated. Thanks in advance.
- Balises:
- Intel® Fortran Compiler
Lien copié
2 Réponses
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
You're on the right track. You will also need a:
!DEC$ ATTRIBUTES REFERENCE :: STRING
to tell the compiler not to look for a separate length argument. You;'ll then need to use INDEX to find the trailing NUL to find the string length or be sure to write a NUL (or CHAR(0) or ""C) to define the length.
Remember also that C is case sensitive, and that because you used attribute C, the external name will be _userfunction.
!DEC$ ATTRIBUTES REFERENCE :: STRING
to tell the compiler not to look for a separate length argument. You;'ll then need to use INDEX to find the trailing NUL to find the string length or be sure to write a NUL (or CHAR(0) or ""C) to define the length.
Remember also that C is case sensitive, and that because you used attribute C, the external name will be _userfunction.
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Thanks, Steve, for that tip. I was getting access errors and crashing the program trying to play with the STRING. even though a MESSAGEBOX call in the FORTRAN routine displayed it OK. The following works for me
In the C++ code:(I made the function name UPPERCASE)
Code:
extern "C" { void __cdecl USERFUNCTION(char *szCommandLine); }
...
...
char szCommandLine[260];
...
...
USERFUNCTION(szCommandLine);(This produces an .OBJ with the symbol _USERFUNCTION in it)
In the FORTRAN:
Code:
SUBROUTINE USERFUNCTION(STRING) ! !DEC$ ATTRIBUTES C, REFERENCE, ALIAS : '_USERFUNCTION' :: USERFUNCTION !DEC$ ATTRIBUTES REFERENCE :: STRING CHARACTER(260) STRING
I found if I used '__stdcall' on the C++ side, the symbol _USERFUNCTION@4 was produced in the .OBJ, so I have to change the ALIAS on the FORTRAN side to match it. Thanks again.
Répondre
Options du sujet
- S'abonner au fil RSS
- Marquer le sujet comme nouveau
- Marquer le sujet comme lu
- Placer ce Sujet en tête de liste pour l'utilisateur actuel
- Marquer
- S'abonner
- Page imprimable