Am 02.05.22 um 21:58 schrieb Jeffrey Kelling:
Hallo.

Nun kenn ich aus Perl die Vorzüge von "Hashes". Darin lassen sich sehr
gut diese Informationen speichern und mit den "keys" die "values" oder
mit den "values" die "Keys" abrufen.
Eine Hasmap ha die STL auch:
https://en.cppreference.com/w/cpp/container/unordered_map

D.h. auch, dass ich nat. weiss, wie groß der Datenraum max. ist. Hier:
40-Pins -> 40-Werte (abzügl. 3,3V, 5V, GND-Pins usw.). Ein dynamisch
angepasster Vector ist nat. wahrscheinlich sinnvoller. Vectoren habe ich
auch schon im Code und habe mir mal angesehen, wie man eigene "Struct"'s
anlegt. Kommt den Perl-Hashes schon sehr nahe.

Ich habe das jetzt so angelegt:

--------


struct csv_values {
      string pin_number;
      string in_out_name;
      string in_out_function;

};
Es ist durchaus sinnvoll das was du über die Datan/Domäne weißt in  Code zu
gießen.

make

g++    -c -o src/lib/init_hw.o src/lib/init_hw.cpp
src/lib/init_hw.cpp:In member function ‘void ZEROHW::init_hw(const
std::vector<std::__cxx11::basic_string<char> >&)’:
src/lib/init_hw.cpp:52:69:error: use of ‘auto
READCSV::read_config_files(const string&)’ before deduction of ‘auto’
    52 |             auto pin_defs =
read_csv.read_config_files(file_names[0]);
       | ^
make: *** [<eingebaut>: src/lib/init_hw.o] Fehler 1
Hast du vllt die Funktion mit `auto` Rückgabetyp in einem Header nur
deklariert, aber nicht definiert? `auto` geht nur, wenn der Compiler beim
Aufruf auch sieht was in der Funktion zurückgegeben wird, wenn sie als auf
irgendeineweise inline bzw. in der gleichen Kompiliereinheit definiert wird.
Wenn die Definition in einer separaten Einiheit ist, dann musst du explizit
sagen was der Rückgabetyp ist, also `std::vector<csv_values>`.

Viele Grüße

Jeffrey


Hallo,

Danke für den Hinweis auf die "unordered map". Das was ich bisher mit der Suche nach "C++ Hash" gefunden habe, funktioniert anders, als eine Hash-Variable in Perl. Die von Dir verlinkte "unordered map" ist da eher das Richtige. Allerdings gefällt mir der "Vector" mit der Möglichkeit eine eigene Struktur zu definieren auch sehr gut. Ich kann damit genau das machen, was ich will (hoffe ich), d.h in dem später aufgerufenen Code möchte ich erstmal über alles, was mit "Output" bezeichnet ist (z.B.: "4;output_1;LCD_LED"), den GPIO richtig mit "gpioSetMode(OUTPUT_1, PI_OUTPUT);" usw. setzen (dafür benötige ich die Pin-Mummer) und in den eigentlichen Programmteilen (Messen und Regeln) eben z.B. immer "gpioWrite(LCD_LED, 1)" oder "gpioWrite(LCD_LED, 0)" zum Ein-/Ausschalten nutzen. Das sollte mit dem Vector machbar sein.

Ok, da ich nicht sinnlos zwischen den Techniken hin und her wechseln möchte, habe ich mich auf den Vector festgelegt. Außerdem habe ich auch noch mal hier [1] nachgeschaut, wie das mit den Referenzen funktioniert, da ich diese ja z.B. auch schon zum Übertragen des Dateinamens verwende. Nur klappt es noch nicht mit der Rückgabe des Vectors.

In der Lesefunktion habe ich das folgendermaßen definiert/ geschrieben:

------ read_csv.cpp -----------

#include "../headers/read_config_files.hpp"
using namespace std;
struct csv_values {
    string pin_number;
    string in_out_name;
    string in_out_function;

};

void read_config_files (const std::string& csv_file_name, vector<csv_values>& elements)
{

//....

------ read_csv.cpp -----------

Die zugehörige Headerdatei:

------ read_config_files.hpp -----------

#ifndef READ_FILES_H
#define READ_FILES_H
using namespace std;

class READCSV
    {
        private:
            struct csv_values {
                        string pin_number;
                        string in_out_name;
                        string in_out_function;
                    };

        public:
            void read_config_files (const std::string& csv_file_name, vector<csv_values>& elements);
    };
#endif

------ read_config_files.hpp -----------

Aufgerufen wird das aus:

------ init_hw.cpp -----------

#include "../headers/init_hw.hpp"
#include "../headers/read_config_files.hpp"

using namespace std;

struct csv_values {
    string pin_number;
    string in_out_name;
    string in_out_function;
};

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 -----------

und die Headerdatei:

------ init_hw.hpp -----------

#ifndef INITHW_H
#define INITHW_H
using namespace std;
class ZEROHW
{
private:

public:
    void init_hw(const std::vector<string> &file_names);
    void set_gpio();
};
#endif

------ init_hw.hpp -----------

Wenn ich das nun versuche zu Kompilieren, kommt ein Fehler:

------------------

make
g++    -c -o src/lib/init_hw.o src/lib/init_hw.cpp
src/lib/init_hw.cpp:In member function ‘void ZEROHW::init_hw(const std::vector<std::__cxx11::basic_string<char> >&)’: src/lib/init_hw.cpp:52:54:error: cannot convert ‘std::vector<csv_values>’ to ‘std::vector<READCSV::csv_values>&’
  52 |            read_csv.read_config_files(file_names[0], elements);
     | ^~~~~~~~
     | |
     | std::vector<csv_values>
In file included from src/lib/init_hw.cpp:33:
src/lib/../headers/read_config_files.hpp:28:91:note:   initializing argument 2 of ‘void READCSV::read_config_files(const string&, std::vector<READCSV::csv_values>&)’   28 |             void read_config_files (const std::string& csv_file_name, vector<csv_values>& elements);
     | ~~~~~~~~~~~~~~~~~~~~^~~~~~~~
make: *** [<eingebaut>: src/lib/init_hw.o] Fehler 1

------------------

Was ich nicht verstehe ist, warum er aus "std::vector<csv_values>" nun ‘std::vector<READCSV::csv_values>&' macht bzw. wo das Problem liegt.

Ich habe auch schon mit "read_config_files(file_names[0], elements);" statt "read_csv.read_config_files(file_names[0], elements);" versucht. Aber dann kommt nat. erwartungsgemäß, dass die Funktion "read_config_files" nicht definiert/ deklariert ist.

Was nun? Wo liegt mein Fehler? Fehlt noch was?

----

Links:

[1] https://www.educba.com/c-plus-plus-pass-by-reference/

--
Mit freundlichen Grüßen

Sebastian Reinhardt


LMV
Landmaschinenvertrieb- und Service GmbH
Hauptstrasse 13G
(OT Hartmannsdorf)
01762 Hartmannsdorf- Reichenau

Geschäftsführer:        Sebastian Reinhardt
Amtsgericht:            Dresden
Handelsregisternummer:  HRB 2574
Umsatzsteuer- Identnr.: DE 140461622


Tel:  +49 373 26 1851
Mobil:+49 172 357 3107
Fax:  +49 373 26 86804
Mail: s...@lmv-hartmannsdorf.de
Web:  www.lmv-hartmannsdorf.de



Antwort per Email an