Die Verwendung von Standardargumenten für Zeiger in C++ kann mit folgendem CodeStandardargumente für Zeiger in C++ und gemischter Programmierung
#include <iostream>
void myfunc_(int var, double* arr = 0) {
if (arr == 0) {
std::cout << "1 arg" << std::endl;
} else {
std::cout << "2 arg" << std::endl;
}
}
int main() {
myfunc(1);
double *arr = new double[2];
myfunc(1, arr);
}
in diesem Fall nachgewiesen werden, die Ausgabe des Programms ist
1 arg
2 arg
auf der anderen Seite, wenn ich versuche, optionale Argumente von Fortran nach C++ zu übergeben, funktioniert es nicht. Das folgende Beispiel demonstriert die sutiation Code
Die myfunc.cpp
#include <iostream>
extern "C" void myfunc_(int var, double* arr = 0) {
if (arr == 0) {
std::cout << "1 arg" << std::endl;
} else {
std::cout << "2 arg" << std::endl;
}
}
und die Fortran Hauptprogramm
program main
use iso_c_binding
real*8 :: arr(2)
call myfunc(1)
call myfunc(1, arr)
end program main
und das gemischte Code (Fortran und C++) zusammengestellt werden können mit folgendem Befehl ohne Fehler
g++ -c myfunc.cpp
gfortran -o main.x myfunc.o main.f90 -lstdc++ -lc++
aber das Programm druckt
2 arg
2 arg
in diesem Fall. Also, gibt es eine Lösung für dieses Problem? Fehle ich hier etwas? Ich denke, dass die Verwendung von Standardargumenten in der gemischten Programmierung nicht wie erwartet funktioniert, aber ich brauche an dieser Stelle einen Vorschlag.
Obwohl die Antwort auf den Dupe nicht akzeptiert wird, denke ich, dass es Ihr Problem anspricht, mit anderen Worten, Sie können nicht-C-Features (wie Standardparameter) beim Kompilieren/Verknüpfen mit 'extern C' haben. Hier sind einige Möglichkeiten, es zu simulieren: http://StackOverflow.com/q/2988038/3093378 – vsoftco
Verwenden von extern "C" ermöglicht dem Linker Fortran myfunc (1) Aufruf an die Funktion mit 2 Argumente zu binden. Aber nur 1 wird geliefert, große Zeit UB. Sie können dies nicht tun, verwenden Sie eine Funktion mit einem anderen Namen wie myfunc2(). –
@vsoftco Ich bin nicht damit einverstanden, das zu duplizieren. Das Problem kann gelöst werden, nur der optionale Argumentteil muss in Fortran erledigt werden, dafür gibt es Unterstützung. –