Auf enum als Member zugreifen
-
SeppJ schrieb:
Problem ist an deinem Code nicht nachvollziehbar, er funktioniert fein. Bitte vollständiges, compilierbares(!) Minimalbeispiel bringen und prüfen, ob es den Fehler reproduziert. Siehe:
Wie man Probleme nachstellbar und nachvollziehbar machtMein Problem ist m.E.n. in dem letzten Link nicht beschrieben. Ist sehr wahrscheinlich ein Anwendungs-/Anwenderfehler..
Alles, was man benötigt:
#include <iostream> #include <fstream> #include <string> #include <limits> #include <vector> #include <algorithm> using namespace std; class APD { public: APD(); APD(ifstream& input); ~APD(); int getSN() const; void setSN(int a_SN); enum Matched{yet_not_matched,already_matched}; Matched getmatch() const; void setmatch(Matched a_matched); void print() const; private: int m_SN; Matched m_matched; }; APD::APD() { m_SN=0.; m_matched=yet_not_matched; } APD::~APD(){} APD::APD(ifstream& input) { while(!input.eof()) { if(isdigit(input.peek())) { break; } else input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } input >> m_SN; } int APD::getSN() const { return m_SN; } void APD::setSN(int a_SN) { m_SN=a_SN; } APD::Matched APD::getmatch() const { return m_matched; } void APD::setmatch(Matched a_matched) { m_matched=a_matched; } int Min() { cout<<endl; const char *INPUTFILE="Test.txt"; ifstream input(INPUTFILE); if(!input) { cerr << "File \"" << INPUTFILE << "\" not found\n \a" << endl; return(-1); } else cout << "Open \"" << INPUTFILE << "\" as input" << endl; vector<APD> apdvec; for(int i=0; !input.eof();i++) { APD apd(input); apdvec.push_back(apd); } if(apdvec.size()==0) { cout << "Reading from \"" << INPUTFILE << "\" failed. No parameters found. \a" << endl; return(-1); } cout << apdvec.size() << " APDs read out" << endl; int SN_i; int matched_i; for(unsigned long int i=0;i<apdvec.size();i++) { SN_i = apdvec[i].getSN(); matched_i = apdvec[i].getmatch(); cout << SN_i << " already matched ? " << matched_i << endl; } cout<<endl; return 0; }Was ich letztlich bewirken möchte: Objekte der Klasse APD sollen bei der Eigenschaft enum Matched ausgeben, ob sie entweder "already_matched" oder "yet_not_matched" sind. Und dies vice versa auch setzen zu können. Aber das Abfragen klappt ja bereits nicht. Bei "cout << SN_i << " already matched ? " << matched_i << endl;" erscheint dann für matched_i 32651 (wo aber ja eigentlich "already_matched" oder "yet_not_matched" erscheinen soll).
Die (Test-)datei zum Einlesen ist auf http://workupload.com/file/KKxMRXm verfügbar.
-
Dein Programm hat diverse Fehler.
1. kein main (zum Nachvollziehen). Soll "Min" die main-Funktion sein?
2. Es wird nie setmatch aufgerufen, daher ist m_matched auch niemals initialisiert worden. Der Wert setzt sich nicht magisch von allein!
3. Deine Einleselogik ist falsch.
3.1 Schleifen mitwhile(!stream.eof())funktionieren nicht, weil eof immer erst NACH fehlgeschlagenem Einlesen gesetzt wird.
3.2 APD-Konstruktor mit stream ist nicht sinnvoll - du weißt doch gar nicht, ob aus dem Stream noch ein APD-Objekt erfolgreich eingelesen werden kann!
-
wob schrieb:
Dein Programm hat diverse Fehler.
1. kein main (zum Nachvollziehen). Soll "Min" die main-Funktion sein?
2. Es wird nie setmatch aufgerufen, daher ist m_matched auch niemals initialisiert worden. Der Wert setzt sich nicht magisch von allein!
3. Deine Einleselogik ist falsch.
3.1 Schleifen mitwhile(!stream.eof())funktionieren nicht, weil eof immer erst NACH fehlgeschlagenem Einlesen gesetzt wird.
3.2 APD-Konstruktor mit stream ist nicht sinnvoll - du weißt doch gar nicht, ob aus dem Stream noch ein APD-Objekt erfolgreich eingelesen werden kann!Schonmal danke!
1. Mein Compiler wollte das als "main" irgendwie nicht. So ging es dann
Im "richtigen" Code steht es auch als main, da lasse ich das alles aber per makefile zusammenfügen.2. Tue ich das nicht per
APD::APD() { m_SN=0.; m_matched=yet_not_matched; }?
3.1 Was bedeutet das ? Mir ist aufgefallen, dass er z.B. den letzten Eintrag doppelt liest. Das wollte ich auf später verschieben bzw. eigentlich wäre das ohnehin egal, da, falls eine Datenreihe schon ausgelesen wurde, dies ausdrücken soll (was ich halt eben mit enum versuche zu tun).
3.2 Und was bedeutet das ? "Noch" im Sinne von einem weiteren Objekt, sprich Datenreihe aus der auszulesenden Datei ?
-
Progressive schrieb:
3.1 Was bedeutet das ?
Das ist wohl einer der verwirrendsten Plenks, die ich je gesehen habe. Ich haben bestimmt 30 Sekunden versucht, ein ? in deinem Code zu finden.
-
SeppJ schrieb:
Progressive schrieb:
3.1 Was bedeutet das ?
Das ist wohl einer der verwirrendsten Plenks, die ich je gesehen habe. Ich haben bestimmt 30 Sekunden versucht, ein ? in deinem Code zu finden.

Ich werde es mir für die Zukunft merken
-
Dein Compiler will das main irgendwie nicht?
Dann nennst du die Funktion anders, führst das Programm aber aus?
-
manni66 schrieb:
Dein Compiler will das main irgendwie nicht?
Dann nennst du die Funktion anders, führst das Programm aber aus?//int main()
root [0] .x Min.cpp warning: cannot find function 'Min()'; falling back to .L//int Min()
root [0] .x Min.cpp Open "Test.txt" as input 5 APDs read out 912009913 already matched ? 32735 912009897 already matched ? 32735 912009912 already matched ? 32735 912009895 already matched ? 32735 912009895 already matched ? 32735 (int) 0PS: Die Datei heißt Min.cpp

-
Das sieht nach vielem aus, nur nicht nach einem C++ Compiler und einem übersetzten C++ Programm.
-
ROOT ist in C++ implementiert(..). Seit Version 6 basiert ROOT auf dem C++ Interpreter Cling, der seinerseits auf dem C++-Compiler Clang und dem Compilerframework LLVM aufbaut. Programme, die das ROOT-Framework verwenden, können entweder nativ durch Einbindung der entsprechenden Bibliotheken und Header kompiliert, oder über den integrierten C++-Interpreter CINT ausgeführt werden.
https://de.wikipedia.org/wiki/ROOT
In der makefile verwende ich g++ als Compiler. Ich weiß aktuell noch nicht, ob ich Root für das aktuelle Vorhaben brauche aber sehr wahrscheinlich wird es irgendwann notwendig.
-
Ah, du nutzt root! Hätte ich mir bei Hamamatsu-Sensoren denken können, die hatten wir im hcal, als ich mich noch damit beschäftigt habe

In root musst du die Funktion natürlich irgendwie != main nennen, wenn du sie als Macro* mit .x ausführen willst oder mit .L laden willst. Bzw. du nennst die genauso wie deine Datei, wenn sie gleich ausgeführt werden soll, also Min.cpp.
Wenn du mit g++ compilierst, dann brauchst du ein main und dann ginge das so:
g++ Min.cpp $(root-config --cflags --ldflags --libs) -o dein-programmEs gibt auch irgendwo in ein FindROOT.cmake, damit man das nicht immer von Hand machen muss.
Ich hoffe für dich nur, dass du ein halbwegs aktuelles ROOT6 nutzt, da der C++-Interpreter von ROOT5 mistig ist (oft ist es auch mal sinnvoll mit
.x Min.cpp+g(beachte das +) den echten Compiler zu nehmen).
* Macro hier im Sinne von Programm, das direkt in ROOT ausgeführt wird, früher per CINT, jetzt ists Cling/LLVM. Das verwirrt C/C++-Entwickler immer, die bei Macro sofort an Präprozessor denken.
-
wob schrieb:
Ah, du nutzt root! Hätte ich mir bei Hamamatsu-Sensoren denken können, die hatten wir im hcal, als ich mich noch damit beschäftigt habe

Wird damit die Anrede "Genosse" zwingend ?
Bin an einem hcal recht nah dran.wob schrieb:
In root musst du die Funktion natürlich irgendwie != main nennen, wenn du sie als Macro* mit .x ausführen willst oder mit .L laden willst. Bzw. du nennst die genauso wie deine Datei, wenn sie gleich ausgeführt werden soll, also Min.cpp.
Durch Trial & Error ist mir das schon aufgefallen, von daher aber gut zu wissen, dass das so sein muss.
wob schrieb:
Wenn du mit g++ compilierst, dann brauchst du ein main und dann ginge das so:
g++ Min.cpp $(root-config --cflags --ldflags --libs) -o dein-programmEs gibt auch irgendwo in ein FindROOT.cmake, damit man das nicht immer von Hand machen muss.
Mein Makefile sieht etwas anders aus aber letztlich dürfte das analog sein. Habe für root I$(ROOTINC)
wob schrieb:
Ich hoffe für dich nur, dass du ein halbwegs aktuelles ROOT6 nutzt, da der C++-Interpreter von ROOT5 mistig ist (oft ist es auch mal sinnvoll mit
.x Min.cpp+g(beachte das +) den echten Compiler zu nehmen).
Habe es letzten Monat endlich auf Version 6 gebracht, davor hatte ich V. 5, was tatsächlich eine Quälerei war.. auch jetzt könnte manches noch besser sein aber man merkt den Unterschied schon deutlich

Danke für den Tipp!wob schrieb:
* Macro hier im Sinne von Programm, das direkt in ROOT ausgeführt wird, früher per CINT, jetzt ists Cling/LLVM. Das verwirrt C/C++-Entwickler immer, die bei Macro sofort an Präprozessor denken.
Das erklärt jetzt wiederum auch eine Konversation kürzlich
