-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: in Objekt direkt einen globalen array verwenden, ohne ihn intern zu kopieren?

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.791

    in Objekt direkt einen globalen array verwenden, ohne ihn intern zu kopieren?

    Anzeige

    hallo,
    in https://www.roboternetz.de/community...608#post648608
    war ja das Problem gelöst, wie man externe Listen von cstrings einlesen/übergeben kann, und diese dann intern in eine objekteigene (per new neu erzeugte) Liste kopiert und weiter verändert werden können.
    Das kostet ntl doppelten Speicher, einmal für alle globalen Muster, und dann für alle einzelnen Objektinstanzen intern noch einmal.

    Daher die Idee: kann man im Objekt direkt einen globalen array verwenden, ohne ihn intern zu kopieren und ohne new (per Pointer oder als Referenz, verwendbar weiterhin als public list)?
    Code:
    class tMenu {
      public:      
         char ** list; 
    
         tMenu (int16_t menulen, int16_t linelen, char ** extlist, tMenu* pMenu) :   // constructor
         MENULEN(5), LINELEN(11), VISLNUM(5), FONTHI(13), act(0)  
         {
            MENULEN = menulen;  // number of available menu options        
            LINELEN = linelen;  // line length of menu options       
            preMenu = pMenu;    // predesessor menu       
                    
            list = extlist; //  ???????  ohne new ??????  <<<<<<< 
         }
    }
    
    
    char * mlist0[11] = {"Titel 0","Zeile1","zu menu02>","Zeile3","Zeile4","Zeile5"}; 
    tMenu menu0(6,11, (char**)mlist0, &menu0);  // numEntries, lineLength, preMenu (N/A);
    
    char * mlist02[11] = {"Titel 02","ESC>","Zeile2","Zeile3","zu menu024"};
    tMenu menu02(5,11, (char**)mlist02, &menu0);  // numEntries, lineLength, preMenu=menu0;
     
    char * mlist024[11] = {"Titel 024","ESC >","Ja","Nein","foo","bas"}; 
    tMenu menu024(6,11, (char**)mlist024, &menu02); // numEntries, lineLength, preMenu=menu02;
    Geändert von HaWe (11.12.2018 um 15:58 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    648
    Blog-Einträge
    5
    Zeiger mittels "&".

    MfG

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.791
    Danke!
    Habe sogar gerade festgestellt: es geht auch wie bisher schon mit dem Pointer (char**) als Aufruf-Parameter und der Zuweisung list=extlist,
    allerdings muss man extrem mit der Länge der Muster-Zeilen anpassen, es geht kaum nachträglich zu manipulieren ohne Buchstabensalat zu produzieren (z.B wenn man alle Einträge mit Leerzeichen auf dieselbe Standardlänge bringen will).
    Da muss ich noch ein wenig experimentieren...

    - - - Aktualisiert - - -

    update,
    @moppi: das mit deinem "&" habe ich noch nicht hinbekommen- wie genau soll das funktionieren?

    Immerhin: es funktioniert mit der direkten Pointerzuweisung, nur Einträge mit Leerzeichen auf dieselbe Standardlänge (11=10+'\0') bringen - das klappt (noch) nicht.
    Der Unterschied im verwendeten RAM ist allerdings auch nicht so dramatisch....
    Geändert von HaWe (11.12.2018 um 18:07 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.791
    was ist der Grund, weshalb ich die internen list-Einträge verändern kann, wenn ich sie kopiert habe,
    aber nicht, wenn ich auf die externe vorbelegte list nur per Pointer verweise?
    Code:
    char * mlist0[11] = {"Titel 0","Zeile1","zu menu02>","Zeile3","Zeile4","Zeile5"}; 
    tMenu menu0(6,11, (char**)mlist0, &menu0);  // numEntries, lineLength, preMenu (N/A);
    Code:
    protected: 
       void parselist(int line) {
            bool issub=false;
            int  len=strlen(list[line]) ;
               
            if(len<1) {
              list[line][0]='#';    // min len=1 
              list[line][1]='\0'; 
              len=1;
            }
            for(int k=len-1; k<LINELEN-1; k++) {
              if(k>0 && list[line][k]=='>') { 
                issub=true;                         // styling when submenu
                list[line][k]=' ';
              }
              if(k>0 && list[line][k]<' ')  list[line][k]=' ';               
            }
            if(issub) list[line][LINELEN-2] = '>';  // if '>' to the end
            else list[line][LINELEN-2] = '.';       // default: '.'  to the end
            list[line][LINELEN-1] = '\0';           // cstring terminator
        }
    Geändert von HaWe (12.12.2018 um 12:53 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.791
    hat sich geklärt, beim Initialisieren werden die einzelnen array-cstrings komprimiert gespeichert, als wären sie Konstanten, ohne freie Restlänge.
    Außerdem bezeichnet bei
    char * liste[n]
    das n sowieso nicht die Einzel-Länge der cstrings wie ich fälschlich dachte, sondern die Anzahl der cstrings insgesamt.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    648
    Blog-Einträge
    5
    Hallo HaWe,

    entschuldige bitte, dass ich nicht mehr nachgesehen hatte und also nicht geantwortet, aber ich hatte sowieso kein Patentrezept.

    Zitat Zitat von HaWe Beitrag anzeigen
    das mit deinem "&" habe ich noch nicht hinbekommen- wie genau soll das funktionieren?
    Du suchtest - verkürzt ausgedrückt - nach einem Weg, auf Speicherinhalt zuzugreifen, ohne ihn zu kopieren.
    Ein Weg wäre mit dem "&", Beispiel:

    Code:
    pWert = &Wert;   // Adressoperator '&' liefert die Adresse einer Variable
    Quelle hier.

    Damit solltest Du über den Adresszeiger auf die Variable zugreifen können (oder Array etc., hat ja alles seine Speicheradresse).
    Das war mein Gedanke dabei.
    Du müsstest eben nur Deiner Funktion oder Methode die Adresse der Variablen übergeben.


    MfG

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.791
    Theoretisch ist das schon klar, aber wie sieht der Code für die Initialisierung und die Referenzierung der 2-dim cstring arrays dann exakt praktisch als lauffähiger C/++ Code aus?
    Als Beispiel s. mein Example für die Menu Class Lib, die ich hier schon gepostet habe
    https://www.roboternetz.de/community...gf-auch-AVR%29
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    648
    Blog-Einträge
    5
    Theoretisch ist das schon klar..
    Super, dachte ich auch so!

    Praktisch fällt mir dazu noch ein, dass es u.U. nicht möglich ist einfach so von überall auf Variablen per Speicheradresszeiger zuzugreifen. In objektorientierter Programmierung könnte in den dortigen Methoden ein Strich durch die Rechnung gemacht werden, weil man theoretisch nicht einfach irgendwo im Speicher hingreifen kann (Schutzmechanismen). Ob das in C/C++ einfach so geht, weiß ich auch nicht, weil ich mich mit C so weit noch nicht beschäftigt habe. Wenn die Zeiger aber ordentlich übergeben werden, viele mir aber kein Grund ein, warum das nicht funktionieren sollte, solang der Compiler weiß, was gemeint und in Maschinencode zu tun ist.

    MfG

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.791
    Hallo,
    Nein, du hast von einer Referenz gesprochen (&) , ich habe aber einen Pointer verwendet, nur per Pointer habe ich es geschafft, nicht aber mit deinem &
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    648
    Blog-Einträge
    5
    Na ja, von Zeiger hatte ich schon gesprochen. Die Beispielseite hatte ich auch verlinkt, dort steht auszugsweise:

    Code:
    int *pWert;      // eine Zeigervariable, zeigt auf einen int
    pWert = &Wert;   // Adressoperator '&' liefert die Adresse einer Variable
    Das ist die richtige Vorgehensweise, wie man auch hier sieht: https://www.arduino.cc/reference/en/...ors/reference/
    Code:
    int *p;       // declare a pointer to an int data typeint i = 5, result = 0;
    p = &i;       // now 'p' contains the address of 'i'
    result = *p;  // 'result' gets the value at the address pointed by 'p' 
    
                  // i.e., it gets the value of 'i' which is 5
    Man muss ja eine Variable als Zeiger nehmen, wo man die Adresse mittels "&" reinlädt. Das ist nun mal so. Muss man dann dazu eben eine Variable als Zeiger/Pointer definieren, wenn es nicht anders geht.

    MfG

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. DCF77 lib ohne Softclock verwenden
    Von elcomportal im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 19.06.2012, 21:14
  2. Antworten: 13
    Letzter Beitrag: 22.02.2007, 21:58
  3. Problem mit globalen Array [gelöst]
    Von OnkelTobi im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 25.11.2006, 16:04
  4. Platine in EAGLE kopieren ohne Änderung der Bauteilnummern
    Von chr-mt im Forum Konstruktion/CAD/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 3
    Letzter Beitrag: 05.08.2005, 13:54
  5. servo direkt an einen Port anschließen?
    Von Zeroeightfifteen im Forum Motoren
    Antworten: 9
    Letzter Beitrag: 18.05.2005, 22:29

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •