Re: C++ stream in variable referenzieren

Sebastian Reinhardt <[email protected]> Tue, 9 Apr 2024 22:56:45 +0200
Newsgroups gmane.user-groups.linux.dresden
Message-ID <[email protected]>
Hallo Konrad,

Danke schon mal für die Antwort. Leider konnte ich mich die letzten Tage 
noch nicht damit beschäftigen. Nun bin ich mir nicht sicher oder ich 
sehe es einfach nicht. Und ja, ich habe wahrscheinlich nicht genau genug 
beschrieben, worum es mir geht. Den Teil, den Du bzgl. des späteren 
findens der Referenz anhand der Portnummer vorgeschlagen hast, ist nicht 
das eigentliche Problem. Ich hätte das zwar nicht so schön gelöst, aber 
so weit bin ich noch nicht...

Um mal noch etwas mehr Hintergrund zu liefern:

Ich habe einen RPi. Dort hängen an 3 verschiedenen I2C-Bus-Leitungen 
(der Hardware-I2C-Bus und 2 mit I2C-GPIO emulierte, deshalb auch die 
Busnummer im Code). Ich habe Ein- und Ausgabe-Bausteine auf diese 
I2C-"Busse" aufgeteilt, da auch noch ein I2C-Drucksensor mit dranhängt, 
der nur 100kHz- Baudrate vertragen. Dennoch reagieren die MCP's rasend 
schnell. Nun weiss ich nicht (ich weiss es schon, aber will nicht alles 
"hardcodieren"), wieviel der MCP23008 oder MCP23017 am jeweiligen Bus 
hängen.

Der Codeteil, um den es mir hier geht, liegt in der Subroutine 
"init_hw". Dort lese ich aus den csv-Dateien die Zeilen für die MCP's ein.

Wir nehmen jetzt mal 2 dieser MCP23017 an und in der csv steht dann 
folgendes:

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

####################
#  MCP-I2C-Portexpander
# mcpxxxx;bus;adresse;input|output;start_pinnr;end_pinnr;Int_A;Int_B
#
mcp23017;3;0x22;input;108;131;22;24
mcp23017;4;0x24;output;208;231;;

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

Normalerweise würde man ja das ganze "hardcodiert" so schreiben:

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

int mcp_inc = 0;

  if ( file_names[0].length() > 0) {
         READCSV read_csv;
         vector<mcp_csv_values> mcp_elements;
         read_csv.read_mcp_config_files(file_names[0], mcp_elements);
         for(int i_e=0; i_e < mcp_elements.size(); i_e++)
             {

                     if ( 
strstr(mcp_elements[i_e].mcptype.c_str(),"mcp23017") ) {

                         if ( mcp_inc == 0) {

                              MCP23017 
mcpout1(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(), 
NULL, 0));

                               for ( int i17 = 0; i17 < 16; i17++) {
                                 if( mcp_elements[i_e].inout_function == 
"input" )  {
                                     // set pin to intput and off/ low
                                     mcpout1.pinMode(i17, INPUT);
                                     mcpout1.pinMode(i17, LOW);
                                    }
                                 else if ( 
mcp_elements[i_e].inout_function == "output" )  {
                                     // set pin to output and off/ low
                                     mcpout1.pinMode(i17, OUTPUT);
                                     mcpout1.pinMode(i17, LOW);
                                     }
                                 else { cout << "error seting MCP 
direction!! exit" << endl; exit; }
                         }

                         else if ( mcp_inc == 1) {

                              MCP23017 
mcpout2(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(), 
NULL, 0));

                               for ( int i17 = 0; i17 < 16; i17++) {
                                 if( mcp_elements[i_e].inout_function == 
"input" )  {
                                     // set pin to intput and off/ low
                                     mcpout2.pinMode(i17, INPUT);
                                     mcpout2.pinMode(i17, LOW);
                                    }
                                 else if ( 
mcp_elements[i_e].inout_function == "output" )  {
                                     // set pin to output and off/ low
                                     mcpout2.pinMode(i17, OUTPUT);
                                     mcpout2.pinMode(i17, LOW);
                                     }
                                 else { cout << "error seting MCP 
direction!! exit" << endl; exit; }
                         }

                         mcp_inc++;

                     }

             }

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

Das gefällt mir nat. nicht. Was, wenn ich 3 MCP's am RPi hängen habe? 
Dann müsste ich das Programm umschreiben und neu kompilieren. Das möchte 
ich nat. nicht!

Nun mein Problem:

Ich möchte das in Kurzform so regeln:

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

int mcp_inc = 0;

  if ( file_names[0].length() > 0) {
         READCSV read_csv;
         vector<mcp_csv_values> mcp_elements;
         read_csv.read_mcp_config_files(file_names[0], mcp_elements);
         for(int i_e=0; i_e < mcp_elements.size(); i_e++)
             {

                     if ( 
strstr(mcp_elements[i_e].mcptype.c_str(),"mcp23017") ) {

                              MCP23017 
mcp_inc(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(), 
NULL, 0));

                             for ( int i17 = 0; i17 < 16; i17++) {
                                 if( mcp_elements[i_e].inout_function == 
"input" )  {
                                     // set pin to intput and off/ low
                                     mcp_inc.pinMode(i17, INPUT);
                                     mcp_inc.pinMode(i17, LOW);
                                    }
                                 else if ( 
mcp_elements[i_e].inout_function == "output" )  {
                                     // set pin to output and off/ low
                                     mcp_inc.pinMode(i17, OUTPUT);
                                     mcp_inc.pinMode(i17, LOW);
                                     }
                                 else { cout << "error seting MCP 
direction!! exit" << endl; exit; }
                         }

                         mcp_inc++;

             }

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

Das Problem ist nur, dass meine Variable ja integer ist und nicht als 
Referenz taugt. D.h., dass obiger Code nat. nicht funktioniert! Der 
dient nur zur Verdeutlichung, was ich machen möchte.

Ich müsste also aus der Integer-Variable eine Referenz für den ostream 
machen und dann möchte ich die eben in einem Vector speichern, den ich 
in die anderen Unterprogramme (z.B. output-thread) übergebe. Dort kommen 
wir dann zum "Raussuchen" anhand der Portnummer. Aber darum geht es mir 
hier noch nicht!

Ich bin mir nicht sicher, ob das überhaupt funktioniert und wenn ja, wie?

Kleine Anmerkung noch für ggf. andere, die das hier mal später lesen:

Die Zeile in meiner früheren Mail:

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

MCP23017 mcpout1.(atoi(mcp_elements[i_e].busnr.c_str()), 
atoi(mcp_elements[i_e].busaddr.c_str()));

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

ist nat. Quatsch. Wenn man die Busadresse als String aus einer csv-Datei 
einliest und diese z.B. "0x20" lautet, dann macht "atoi()" daraus "0". 
Deshalb muss das eben so lauten:

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

MCP23017 
mcpout1(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(), 
NULL, 0));

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

Aber das nur am Rande. Da habe ich zu viel herumprobiert und mir einen 
Fehler eingebaut.

-- 
Mit freundlichen Grüßen

Sebastian Reinhardt