Új hozzászólás Aktív témák

  • Janos250

    őstag

    A múltkori késő esti string és String kínlódásom után úgy döntöttem, hogy nincs értelme a brute force módszernek, inkább gondoljuk át logikusan. És tényleg! Ideírom a tapasztalataim, hátha valaha valakinek hasznos lesz a jövőben.
    Kösz mindenkinek, aki segített! :R

    Arduino String (nagybetűs), és a C++ string (kisbetűs) kapcsolata.

    Az Arduino String nem írható be paraméterként olyan helyre, ahol C++ string az elvárás, és ez fordítva is igaz.
    A kettő közötti átmenetet a .c_str() tagfüggvény teszi lehetővé.

    String ArduinoString_Hello = "Hello";
    string Cpp_string_World = "World";

    Ezekkel
    String ArduinoString_Hello02 = Cpp_string_World.c_str();
    String ArduinoString_Hello03 (Cpp_string_World.c_str());
    string Cpp_string_World02 = ArduinoString_Hello.c_str();
    string Cpp_string_World03 (ArduinoString_Hello.c_str());

    Így új példányok jönnek létre.

    A szöveget mind a String, mind a string belül egy 0x0 terminált karakter tömbben tárolja, és a .c_str() konstans pointer mutat rá, ezért ha (char*) C típusú sztinget akarunk, akkor "const" miatt (char*) átdefiniálás szükséges.
    Például:

    char* ArduinoString_Hello_c_str = (char*)ArduinoString_Hello.c_str() ;
    char* Cpp_string_World_c_str = (char*)Cpp_string_World.c_str() ;

    Ebben az esetben nem jön létre új példány, hanem a char* típusú karaktertömb pointere is az eredeti objektumban tárolt karaktertömb kezdetére mutat. Ha az egyikben megváltoztatjuk valamelyik karaktert, a másikban is megváltozik.

    Az ESP32-höz használt fordító ismeri az iterátor típust is. A C++ string rendelkezik .begin(), .end() iterátorral.

    for ( std::string::iterator it=Cpp_string_World.begin(); it!=Cpp_string_World.end(); ++it)
    std::cout << *it;
    std::cout << '\n';

    /*
    Woyld
    */

    std::string::iterator it=Cpp_string_World.begin();
    std::cout << "Cpp_string_World.begin() = :" << *it<< "\n"; // W

    it=Cpp_string_World.end()-1; // mert a .end() a 0x0 terminátorra mutat
    std::cout << "Cpp_string_World.end() = :" << *it<< "\n"; // d

    Mintának egy teljes program:

    #define __cplusplus 201103L
    #include <iostream>
    using namespace std;

    void setup() {
    Serial.begin(115200);
    delay(2000);

    Serial.println("Arduino String (nagybetus), es a C++ string (kisbetus) kapcsolata.");

    String ArduinoString_Hello = "Hello";
    string Cpp_string_World = "World";

    String ArduinoString_Hello02 = Cpp_string_World.c_str();
    String ArduinoString_Hello03 (Cpp_string_World.c_str());

    Serial.printf("ArduinoString_Hello :%s\n",ArduinoString_Hello);
    Serial.printf("ArduinoString_Hello02 :%s\n",ArduinoString_Hello02);
    Serial.printf("ArduinoString_Hello03 :%s\n",ArduinoString_Hello03);
    Serial.printf("ArduinoString_Hello[0]:%c\n",ArduinoString_Hello[0]);
    Serial.printf("ArduinoString_Hello.c_str()[0]:%c\n\n",ArduinoString_Hello.c_str()[0]);
    /*
    ArduinoString_Hello :Hello
    ArduinoString_Hello02 :World
    ArduinoString_Hello03 :World
    ArduinoString_Hello[0]:H
    ArduinoString_Hello.c_str()[0]:H
    */

    string Cpp_string_World02 = ArduinoString_Hello.c_str();
    string Cpp_string_World03(ArduinoString_Hello.c_str());

    std::cout << "Cpp_string_World :" << Cpp_string_World<< "\n";
    std::cout << "Cpp_string_World02 :" << Cpp_string_World02 << "\n";
    std::cout << "Cpp_string_World03 :" << Cpp_string_World03 << "\n";
    /*
    Cpp_string_World :World
    Cpp_string_World02 :Hello
    Cpp_string_World03 :Hello
    */

    char* ArduinoString_Hello_c_str = (char*)ArduinoString_Hello.c_str() ;
    char* Cpp_string_World_c_str = (char*)Cpp_string_World.c_str() ;

    ArduinoString_Hello_c_str[2] = 'x';
    Cpp_string_World[2]= 'y';
    Serial.printf("ArduinoString_Hello is atirodik :%s\n",ArduinoString_Hello);
    std::cout << "Cpp_string_World_c_str is atirodik :" << Cpp_string_World << "\n";
    /*
    ArduinoString_Hello is atirodik :Hexlo
    Cpp_string_World_c_str is atirodik :Woyld
    */

    // iterator:
    std::cout << "Iterator:\n";
    for ( std::string::iterator it=Cpp_string_World.begin(); it!=Cpp_string_World.end(); ++it)
    std::cout << *it;
    std::cout << '\n';
    /*
    Woyld
    */
    std::string::iterator it=Cpp_string_World.begin();
    std::cout << "Cpp_string_World.begin() = :" << *it<< "\n"; // W

    it=Cpp_string_World.end()-1; // mert a .end() a 0x0 terminátorra mutat
    std::cout << "Cpp_string_World.end() = :" << *it<< "\n"; // d

    } ;

    void loop() {} ;

Új hozzászólás Aktív témák