Array Initialisierung in anderer Datei
-
Hallo zusammen,
nach vielen Jahren bin ich dabei mal wieder etwas in C++ zu programmieren und hänge jetzt an einer vermutlich sehr einfachen Sache schon seit zwei Tagen fest.
Mein Projekt soll später acht Arrays mit jeweils 1024 Werten beinhalten. Die Deklaration und Initialisierung soll aus Übersichtsgründen nicht in der main.cpp erfolgen. Ich habe also eine ext.cpp und ext.hpp erstellt.
main.cpp
#include "ext.h" int main() { double value; value=rhp[1]; //Testweise den zweiten Wert des Arrays auslesen }
ext.hpp
#ifndef EXT_H #define EXT_H extern double rhp[1024]; #endif // EXT_H
ext.cpp
#include "ext.h" double rhp[1024]={20.1, 23.5, 24.5, 25.2}; //ein paar Werte für Testzwecke
An sich alles wunderbar. Das Auslesen dieser Werte in der main.cpp funktioniert ohne Probleme. Allerdings wird das mit 1024 Werten in den geschweiften Klammern des Arrays natürlich sehr unübersichtlich. Die Frage, die ich jetzt habe ist, wie kann ich das in dieser nachfolgenden Schreibweise initialisieren?
ext.cpp
#include "ext.h" double rhp[1024]; rhp[0]=20.1; rhp[1]=23.5; rhp[2]=24.5; rhp[3]=25.2; //...usw
Sobald ich das in dieser Schreibweise schreibe, werden die unteren drei Zeilen von rhp unterringelt mit dem Hinweis "expected a declaration".
Was mache ich falsch bzw. was fehlt hier noch?
Danke schon mal für jeden Hinweis und jede Hilfe!
Schöne Grüße
Marius
-
Der Titel ist aber schon sehr irreführend
Wenn die Werte schon irgendwo stehen, sie einfach in einer Schleife in Dein array einlesen. Automatisiertes Eingeben von Hand ist glaube ich nicht möglich, wenn man nicht weiß, welcher Wert als nächstes kommt.
Allerdings solltest Du Dich festlegen, ob std::array oder std::vector, wenn es bestimmt nur 1024 Werte sind, dann ersteres.
-
rhp[0]=20.1;
Das ist ein expression statement, eine Anweisung, die so nur im Körper einer Funktion auftreten kann.
Du könntest also die "Initialisierung" in einer Funktion vornehmen und müsstest nur dafür sorgen, dass diese Funktion aufgerufen wird, bevor irgendwelche Werte von rhp verwendet werden. Das ist könnte im einfachsten Fall dadurch geschehen, dass du diese Funktion einfach in main einmal aufrufst. Eine andere Möglichkeit, ist die Funktion zur dynamischen Initialsierung aufzurufen:#include "ext.h" double rhp[1024]; namespace { int init_rhp() { rhp[0]=20.1; rhp[1]=23.5; ... } int dummy = init_rhp(); }
Dummerweise hängt es von der Implementierung ab, ob die dynamische Initialisierung von dummy auch tatsächlich vor dem Aufruf von main durchgeführt wird.
Ab C++14 besteht die Möglichkeit, das Ganze auch in einer constexpr-Funktion durchzuführen, die ein passendes Array als Rückgabewert hat - ein einfaches Array kommt damit allerdings nat. nicht in Frage, weil dieses nicht kopiert werden kann.
#include <array> #include "ext.h" constexpr auto make_rhp() { std::array<double, 1024> rhp; rhp[0]=20.1; rhp[1]=23.5; ... return rhp; } auto rhp = make_rhp();
(noch eleganter in C++17 mit Lambda)
Das führt zu statischer Initialisierung, die garantiert vor main fertig ist.
-
Counterdoc schrieb:
Allerdings wird das mit 1024 Werten in den geschweiften Klammern des Arrays natürlich sehr unübersichtlich.
Je nachdem, wie kunstvoll Du den Quellcode formatierst muss das nicht unübersichtlich sein.
Bei 1024 Werten würde ich allerdings den Code aus den Originaldaten generieren lassen. Oder Copy/Paste bemühen.
Dann ist mir die Übersichtlichkeit recht schnuppe und ich schließe "menschliches Versagen" als Fehlerursache aus...
-
Super, mit den Infos konnte ich was anfangen! Ich hab es jetzt einfach über eine Funktion gemacht, welche dann in der main aufgerufen wird.
Furble Wurble schrieb:
Je nachdem, wie kunstvoll Du den Quellcode formatierst muss das nicht unübersichtlich sein.
Bei 1024 Werten würde ich allerdings den Code aus den Originaldaten generieren lassen. Oder Copy/Paste bemühen.
Dann ist mir die Übersichtlichkeit recht schnuppe und ich schließe "menschliches Versagen" als Fehlerursache aus...Das stimmt schon, aber ich hab das gern "extra" übersichtlich
Vielen Dank an alle!
-
Hast du jetzt wirklich 1024 Zeilen mit einzelnen Zuweisungen in deinem Code? Und du nennst das übersichtlich?