Am 03.05.22 um 21:51 schrieb Konrad Rosenbaum:
Hi,
warum definierst Du die Struktur csv_values mehrfach? Einmal reicht. Insbesondere die Definition als private Sub-Class in READCSV ist sinnlos.
Einmal in exakt einer Header-Datei deklarieren und diese Datei überall #include'n wo du sie brauchst.
Noch ein Tipp:
der Include-Guard: #ifndef XX_H #define XX_H //... #endif
...also ich verzähle mich da immer. Das hier ist einfacher:
#pragma once
Du schreibst es ganz an den Anfang der Datei (dort wo Du #ifndef hast) und vergisst den ganzen ifndef/define/endif Kram einfach. Alle modernen Compiler verstehen dieses Pragma - es bedeutet dass der Compiler sicherstellt dass diese Datei nur einmal interpretiert wird, auch wenn sie mehrfach eingebunden wird.
Konrad
Hallo Konrad,
Danke für den Tipp und die ganzen Hinweise. Ich habe mir nun eine Headerdatei mit der Deklaration erstellt und diese in die Datei mit den eigentlichen Leseroutinen eingefügt. Auch in der Datei mit dem Aufruf der Funktion habe ich die Headerdatei eingefügt. Nun läuft zwar der Compiler durch, aber der Linker wirft einen Fehler:
-------------
make g++ -g src/zero_controller_SNR.o src/lib/i2c_lcd/lcdDriver.o src/lib/i2c_lcd/i2cControl.o src/lib/display.o src/lib/sensor.o src/lib/read_csv.o src/lib/init_hw.o -o zero_controller_SNR -lpthread -lpigpio -lrt /usr/bin/ld: src/lib/init_hw.o: in function `ZEROHW::init_hw(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha r> > > > const&)': init_hw.cpp:(.text+0x60): undefined reference to `READCSV::read_config_files(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<csv_values, std::allocator<csv_values> >&)' collect2: error: ld returned 1 exit status make: *** [Makefile:20: all] Fehler 1 -------------
Was ich nicht verstehe ist, warum die Funktion undefiniert ist, wenn ich in der "init_hw.cpp" über die Header-Datei "read_config_files.hpp" diese Funktion und auch die Struktur ja eigentlich definiert haben sollte und der Compiler diese auch kennt/ findet......?
Die fraglichen Teile der Dateien sehen so aus:
-------------init_hw.cpp-------------
#include "../headers/glob_pragma_001.hpp" #include "../headers/init_hw.hpp" #include "../headers/read_config_files.hpp"
using namespace std;
void ZEROHW::init_hw(const std::vector<string> &file_names) { READCSV read_csv; vector<csv_values> elements;
if (file_names[3].length() < 0) { read_csv.read_config_files(file_names[0], elements); }
-------------init_hw.cpp-------------
-------------read_csv.cpp-------------
#include "../headers/glob_pragma_001.hpp"
#include "../headers/init_hw.hpp" #include "../headers/read_config_files.hpp"
using namespace std;
void read_config_files (const std::string& csv_file_name, vector<csv_values> &elements) { ifstream csv_in_file; -------------read_csv.cpp-------------
-------------read_config_files.hpp-------------
#include "glob_pragma_001.hpp"
using namespace std; // Define some device parameters class READCSV { private: public: void read_config_files (const std::string& csv_file_name, vector<csv_values> &elements); };
-------------read_config_files.hpp-------------
-------------glob_pragma_001.hpp-------------
#pragma once
using namespace std;
struct csv_values { string pin_number; string in_out_name; string in_out_function; };
-------------glob_pragma_001.hpp-------------