- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 15

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    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 17:07 Uhr)

  2. #2
    HaWe
    Gast
    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 11:53 Uhr)

  3. #3
    HaWe
    Gast
    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.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    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

  5. #5
    HaWe
    Gast
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    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

  7. #7
    HaWe
    Gast
    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 &

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    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

  9. #9
    HaWe
    Gast
    Du verstehst nicht den Punkt:
    Man kann Varaiblen per * als Pointer übergeben, wie ich es getan habe, oder per & als Referenz (Adresse ), wie du es oben geschrieben hast.
    Zu deinem Vorschlag fehlt aber noch der tatsächlich funktionierende Code zu dem beschriebenen 2-dim array Problem. Hier ist mir noch schleierhaft, wie du einen
    char*mlist[n ] = {"a", "foo", "dfghj",.... }

    referenziert per & an die Objektinstanz übergeben willst, so dass man dort darauf als array
    char list [m ][n ]
    Oder als
    char** list
    zugreifen kann.

    Schreib doch mal bitte diesen genauen, getesteten Code hier rein, wie du das meinst.

  10. #10
    HaWe
    Gast
    Also asm hilft hier nun wirklich nicht weiter...
    Mich interessiert nur, wie man es ganz praktisch in C alternativ die Variablenübergabe (in diesem Falle einen 2-dim char array) an eine Funktion per Referenz codiert, so wie du es vorgeschlagen hast, sodass es ebenfalls so wie mit der Übergabe mit Hilfe von Pointern funktioniert.

    global im Hauptprogramm:
    Code:
    char mlist0[6][11] = {"Titel 0","Zeile1","zu menu02>","Zeile3","Zeile4","Zeile5"};
    Und wie muss hier die lokale list innerhalb der Objekt-Funktion defiiniert werden? Die Funktion "weiß" ja zunächst noch gar nicht, wie groß die Dimensionen des Arrays sind, die "6" und die "11" werden der Objekt-Instanz ja erst gesondert bei der Instantiierung mitgeteileilt - daher verwende ich bisher den "Doppel-Pointer" als Platzhalter
    Code:
    class tMenu {
      public:      
         char ** list; 
      //
    }


    (editiert)
    Geändert von HaWe (03.01.2019 um 15:13 Uhr)

Ähnliche Themen

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

Berechtigungen

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

Solar Speicher und Akkus Tests