2017-01-24 2 views
1

Ich habe einen Code geschrieben, der mathematische Funktionen aus einer Textdatei liest, die in einem C++ kompatiblen Format sind und mathematische Operationen auf sie anwenden. Dies ist eine kurze Zusammenfassung des Codes. Ich bin mir bewusst, dass #include eine Präprozessordirektive ist. Wenn der Inhalt der Datei eingelesen wurde, wird der Code jedesmal über ein Bash-Skript kompiliert.Include-Datei vom Terminal in Funktion gelesen mit #include

double myfunc(long double x){ 
    return 
    #include "/.../filename" 
} 

int main{ 
    "Maths stuff happens here" 
} 

Dies funktioniert wie beabsichtigt, aber ich möchte in der Lage sein, den Prozess zu beschleunigen und die Dateinamen vom Terminal zu lesen, anstatt sie in das Skript jedes Mal eingeben. Um dies zu tun Ich habe versucht, mit dem folgenden:

int g_argc; 
char **g_argv; 

void process_command_() 
{ 
    filename=argv[1] 
} 

double myfunc(long double x){ 
    return 
    #include filename 
} 

int main{ 
    "Maths stuff happens here" 
} 

Es war so etwas wie eine Strecke zu denken, dies funktionieren würde, aber ich bin nicht sicher, wie Sie die Dateinamen aus dem Terminal in meine Funktion zu lesen, als ob ich es getippt hatte in mir aufgrund der Funktion außerhalb von int main(). Ich habe mich in StackExchange umgesehen und ähnliche Probleme gefunden, aber keine der Lösungen hat für meinen Fall funktioniert.

Jede Hilfe wird sehr geschätzt.

Für Klarheit bearbeiten Dieser Code ist ein numerischer Integrationscode, der einen sehr großen Integranden als Eingabe aus einer Textdatei verwendet und die Integration mit der CUBA-Bibliothek durchführt. Ich habe den Prozess von Maple nach C++ verschoben, um Geschwindigkeit und Genauigkeit zu erhöhen. Das Skript funktioniert wunderbar und kann bekannte Werte ~ 400 mal schneller replizieren als Maple/Mathematica.

+1

So funktioniert C++ überhaupt nicht **. Was ist das Problem, das du lösen willst? Sie müssen zurücktreten und die Situation neu bewerten. –

+1

Ein '#include ...' im Funktionsumfang zu machen ist aus irgendeinem Grund eine schlechte Idee. Nichtsdestoweniger, vielleicht, [this] (http://stackoverflow.com/a/3179218/1621391) kann relevant sein - Dann können Sie das MACRO mit einigen Compiler-Schalter steuern – WhiZTiM

+0

Es ist eine numerische Integration Routine, die ursprünglich in Maple gemacht wurde/Mathematica aber ich brauchte eine Geschwindigkeitssteigerung, also wandle ich den Integranden von Maple in ein C++ kompatibles Format und gebe diese Datei in eine C++ Routine mit der CUBA-Bibliothek ein. Es bietet eine enorme Geschwindigkeitssteigerung, ich wollte nur den Rechenprozess beschleunigen, indem ich mit einem Bash-Skript automatisiert habe. – Yeti

Antwort

0

WhiZTiMs Kommentar/Link ließ mich erkennen, dass dies eine wirklich dumme Frage ist, also entschuldige mich dafür, dass du deine Zeit verschwendet hast. Was ich will, kann im Bash-Skript gemacht werden. Ich sehe nur einen Platzhalter in dem main.cpp

double myfunc(long double x){ 
    return 
    #include <filename> 
} 

Next Ich habe ein einfacher Bash-Skript zu kopieren Sie die main.cpp run-Datei in das Verzeichnis, in dem der Eingang TXT-Datei ist und mit sed ‚s finden und Befehl ersetzen es schaltet die filename in main.cpp für die eigentliche Datei, die vom Terminal genommen wird:

input_file=("$PWD/${@}") 
cp ${HOME}/.../main.cpp $PWD 
sed -i "s|filename|${input_file}|g" main.cpp 

und dann kompiliert und Befehle am Ende des Skripts ausführen.

Vielen Dank für Ihre Hilfe bei dieser Frage. Ich kann nicht glauben, dass ich die Lösung nicht so einfach gesehen habe.

1

Vielleicht der einfachste Weg für Sie wäre dies.

double myfunc(long double x){ 
    return 
    #include MY_FILENAME 
} 

Dann, wenn Sie der Compiler in process_command() es ein zusätzliches Argument übergeben:

"-DMY_FILENAME=/path/to/your/file" 

Dies ist eine Zeichenfolge, die Sie aus argv[1] aufbauen müssen oder was auch immer speichert Ihre Dateinamen.

Wenn Sie ein Bash-Skript aufrufen, das den Compiler aufruft, müssen Sie Ihren Dateinamen als Argument an das Skript übergeben und veranlassen, dass das Skript es zusammen mit -DMY_FILENAME= an den Compiler selbst weiterleitet.

Verwandte Themen